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; 20787828ca2SBarry Smith PetscScalar *x,*y; 208c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 20967e560aaSBarry Smith 2103a40ed3dSBarry Smith PetscFunctionBegin; 211c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 2121ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2131ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 214d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 215d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 216ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 217e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 218ae7cfcebSSatish Balay #else 2198b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 220e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 221ae7cfcebSSatish Balay #endif 222d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 223ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 224e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 225ae7cfcebSSatish Balay #else 2268b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 227e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 228ae7cfcebSSatish Balay #endif 2292205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 2301ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2311ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 232dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 2333a40ed3dSBarry Smith PetscFunctionReturn(0); 234289bc588SBarry Smith } 2356ee01492SSatish Balay 2364a2ae208SSatish Balay #undef __FUNCT__ 23785e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense" 23885e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 23985e2c93fSHong Zhang { 24085e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 24185e2c93fSHong Zhang PetscErrorCode ierr; 24285e2c93fSHong Zhang PetscScalar *b,*x; 243efb80c78SLisandro Dalcin PetscInt n; 244783b601eSJed Brown PetscBLASInt nrhs,info,m; 245bda8bf91SBarry Smith PetscBool flg; 24685e2c93fSHong Zhang 24785e2c93fSHong Zhang PetscFunctionBegin; 248c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 2490298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 250ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix"); 2510298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 252ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix"); 253bda8bf91SBarry Smith 2540298fd71SBarry Smith ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr); 255c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr); 2568c778c55SBarry Smith ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr); 2578c778c55SBarry Smith ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr); 25885e2c93fSHong Zhang 259f272c775SHong Zhang ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr); 26085e2c93fSHong Zhang 26185e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 26285e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS) 26385e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 26485e2c93fSHong Zhang #else 2658b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 26685e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 26785e2c93fSHong Zhang #endif 26885e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 26985e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS) 27085e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 27185e2c93fSHong Zhang #else 2728b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info)); 27385e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 27485e2c93fSHong Zhang #endif 2752205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 27685e2c93fSHong Zhang 2778c778c55SBarry Smith ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr); 2788c778c55SBarry Smith ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr); 27985e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 28085e2c93fSHong Zhang PetscFunctionReturn(0); 28185e2c93fSHong Zhang } 28285e2c93fSHong Zhang 28385e2c93fSHong Zhang #undef __FUNCT__ 2844a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense" 285dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 286da3a660dSBarry Smith { 287c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 288dfbe8321SBarry Smith PetscErrorCode ierr; 28987828ca2SBarry Smith PetscScalar *x,*y; 290c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 29167e560aaSBarry Smith 2923a40ed3dSBarry Smith PetscFunctionBegin; 293c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 2941ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2951ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 296d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 297752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 298da3a660dSBarry Smith if (mat->pivots) { 299ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 300e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 301ae7cfcebSSatish Balay #else 3028b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 303e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 304ae7cfcebSSatish Balay #endif 3057a97a34bSBarry Smith } else { 306ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 307e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 308ae7cfcebSSatish Balay #else 3098b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 310e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 311ae7cfcebSSatish Balay #endif 312da3a660dSBarry Smith } 3131ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3141ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 315dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 3163a40ed3dSBarry Smith PetscFunctionReturn(0); 317da3a660dSBarry Smith } 3186ee01492SSatish Balay 3194a2ae208SSatish Balay #undef __FUNCT__ 3204a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense" 321dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 322da3a660dSBarry Smith { 323c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 324dfbe8321SBarry Smith PetscErrorCode ierr; 32587828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 326da3a660dSBarry Smith Vec tmp = 0; 327c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 32867e560aaSBarry Smith 3293a40ed3dSBarry Smith PetscFunctionBegin; 330c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 3311ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 3321ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 333d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 334da3a660dSBarry Smith if (yy == zz) { 33578b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 3363bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 33778b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 338da3a660dSBarry Smith } 339d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 340752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 341da3a660dSBarry Smith if (mat->pivots) { 342ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 343e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 344ae7cfcebSSatish Balay #else 3458b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 346e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 347ae7cfcebSSatish Balay #endif 348a8c6a408SBarry Smith } else { 349ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 350e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 351ae7cfcebSSatish Balay #else 3528b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 353e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 354ae7cfcebSSatish Balay #endif 355da3a660dSBarry Smith } 3566bf464f9SBarry Smith if (tmp) { 3576bf464f9SBarry Smith ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 3586bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 3596bf464f9SBarry Smith } else { 3606bf464f9SBarry Smith ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 3616bf464f9SBarry Smith } 3621ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3631ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 364dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 3653a40ed3dSBarry Smith PetscFunctionReturn(0); 366da3a660dSBarry Smith } 36767e560aaSBarry Smith 3684a2ae208SSatish Balay #undef __FUNCT__ 3694a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense" 370dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 371da3a660dSBarry Smith { 372c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 3736849ba73SBarry Smith PetscErrorCode ierr; 37487828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 375da3a660dSBarry Smith Vec tmp; 376c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 37767e560aaSBarry Smith 3783a40ed3dSBarry Smith PetscFunctionBegin; 379c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 380d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 3811ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 3821ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 383da3a660dSBarry Smith if (yy == zz) { 38478b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 3853bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 38678b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 387da3a660dSBarry Smith } 388d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 389752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 390da3a660dSBarry Smith if (mat->pivots) { 391ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 392e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 393ae7cfcebSSatish Balay #else 3948b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 395e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 396ae7cfcebSSatish Balay #endif 3973a40ed3dSBarry Smith } else { 398ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 399e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 400ae7cfcebSSatish Balay #else 4018b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 402e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 403ae7cfcebSSatish Balay #endif 404da3a660dSBarry Smith } 40590f02eecSBarry Smith if (tmp) { 4062dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 4076bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 4083a40ed3dSBarry Smith } else { 4092dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 41090f02eecSBarry Smith } 4111ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 4121ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 413dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 4143a40ed3dSBarry Smith PetscFunctionReturn(0); 415da3a660dSBarry Smith } 416db4efbfdSBarry Smith 417db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 418db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 419db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 420db4efbfdSBarry Smith #undef __FUNCT__ 421db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense" 4220481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 423db4efbfdSBarry Smith { 424db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 425db4efbfdSBarry Smith PetscFunctionBegin; 426e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 427db4efbfdSBarry Smith #else 428db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 429db4efbfdSBarry Smith PetscErrorCode ierr; 430db4efbfdSBarry Smith PetscBLASInt n,m,info; 431db4efbfdSBarry Smith 432db4efbfdSBarry Smith PetscFunctionBegin; 433c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 434c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 435db4efbfdSBarry Smith if (!mat->pivots) { 436785e854fSJed Brown ierr = PetscMalloc1((A->rmap->n+1),&mat->pivots);CHKERRQ(ierr); 4373bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 438db4efbfdSBarry Smith } 439db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 4408e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 4418b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info)); 4428e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 4438e57ea43SSatish Balay 444e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 445e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 446db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 447db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 448db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 449db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 450d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 451db4efbfdSBarry Smith 452dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 453db4efbfdSBarry Smith #endif 454db4efbfdSBarry Smith PetscFunctionReturn(0); 455db4efbfdSBarry Smith } 456db4efbfdSBarry Smith 457db4efbfdSBarry Smith #undef __FUNCT__ 458db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense" 4590481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 460db4efbfdSBarry Smith { 461db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 462db4efbfdSBarry Smith PetscFunctionBegin; 463e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 464db4efbfdSBarry Smith #else 465db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 466db4efbfdSBarry Smith PetscErrorCode ierr; 467c5df96a5SBarry Smith PetscBLASInt info,n; 468db4efbfdSBarry Smith 469db4efbfdSBarry Smith PetscFunctionBegin; 470c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 471db4efbfdSBarry Smith ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 472db4efbfdSBarry Smith 473db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 4748b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info)); 475e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 476db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 477db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 478db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 479db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 480d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 4812205254eSKarl Rupp 482*eb3f19e4SBarry Smith ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 483db4efbfdSBarry Smith #endif 484db4efbfdSBarry Smith PetscFunctionReturn(0); 485db4efbfdSBarry Smith } 486db4efbfdSBarry Smith 487db4efbfdSBarry Smith 488db4efbfdSBarry Smith #undef __FUNCT__ 489db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense" 4900481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 491db4efbfdSBarry Smith { 492db4efbfdSBarry Smith PetscErrorCode ierr; 493db4efbfdSBarry Smith MatFactorInfo info; 494db4efbfdSBarry Smith 495db4efbfdSBarry Smith PetscFunctionBegin; 496db4efbfdSBarry Smith info.fill = 1.0; 4972205254eSKarl Rupp 498c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 499719d5645SBarry Smith ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr); 500db4efbfdSBarry Smith PetscFunctionReturn(0); 501db4efbfdSBarry Smith } 502db4efbfdSBarry Smith 503db4efbfdSBarry Smith #undef __FUNCT__ 504db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense" 5050481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 506db4efbfdSBarry Smith { 507db4efbfdSBarry Smith PetscFunctionBegin; 508c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 5091bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 510719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 511db4efbfdSBarry Smith PetscFunctionReturn(0); 512db4efbfdSBarry Smith } 513db4efbfdSBarry Smith 514db4efbfdSBarry Smith #undef __FUNCT__ 515db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense" 5160481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 517db4efbfdSBarry Smith { 518db4efbfdSBarry Smith PetscFunctionBegin; 519b66fe19dSMatthew G Knepley fact->preallocated = PETSC_TRUE; 520c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 521719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 522db4efbfdSBarry Smith PetscFunctionReturn(0); 523db4efbfdSBarry Smith } 524db4efbfdSBarry Smith 525db4efbfdSBarry Smith #undef __FUNCT__ 526db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc" 5278cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 528db4efbfdSBarry Smith { 529db4efbfdSBarry Smith PetscErrorCode ierr; 530db4efbfdSBarry Smith 531db4efbfdSBarry Smith PetscFunctionBegin; 532ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr); 533db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 534db4efbfdSBarry Smith ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr); 535db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU) { 536db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 537db4efbfdSBarry Smith } else { 538db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 539db4efbfdSBarry Smith } 540d5f3da31SBarry Smith (*fact)->factortype = ftype; 541db4efbfdSBarry Smith PetscFunctionReturn(0); 542db4efbfdSBarry Smith } 543db4efbfdSBarry Smith 544289bc588SBarry Smith /* ------------------------------------------------------------------*/ 5454a2ae208SSatish Balay #undef __FUNCT__ 54641f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense" 54741f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 548289bc588SBarry Smith { 549c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 55087828ca2SBarry Smith PetscScalar *x,*b,*v = mat->v,zero = 0.0,xt; 551dfbe8321SBarry Smith PetscErrorCode ierr; 552d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 553c5df96a5SBarry Smith PetscBLASInt o = 1,bm; 554289bc588SBarry Smith 5553a40ed3dSBarry Smith PetscFunctionBegin; 556c5df96a5SBarry Smith ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr); 557289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 55871044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 5592dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 560289bc588SBarry Smith } 5611ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5621ebc52fbSHong Zhang ierr = VecGetArray(bb,&b);CHKERRQ(ierr); 563b965ef7fSBarry Smith its = its*lits; 564e32f2f54SBarry 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); 565289bc588SBarry Smith while (its--) { 566fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 567289bc588SBarry Smith for (i=0; i<m; i++) { 5688b83055fSJed Brown PetscStackCallBLAS("BLASdot",xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o)); 56955a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 570289bc588SBarry Smith } 571289bc588SBarry Smith } 572fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 573289bc588SBarry Smith for (i=m-1; i>=0; i--) { 5748b83055fSJed Brown PetscStackCallBLAS("BLASdot",xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o)); 57555a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 576289bc588SBarry Smith } 577289bc588SBarry Smith } 578289bc588SBarry Smith } 5791ebc52fbSHong Zhang ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr); 5801ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5813a40ed3dSBarry Smith PetscFunctionReturn(0); 582289bc588SBarry Smith } 583289bc588SBarry Smith 584289bc588SBarry Smith /* -----------------------------------------------------------------*/ 5854a2ae208SSatish Balay #undef __FUNCT__ 5864a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense" 587dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 588289bc588SBarry Smith { 589c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 59087828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 591dfbe8321SBarry Smith PetscErrorCode ierr; 5920805154bSBarry Smith PetscBLASInt m, n,_One=1; 593ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 5943a40ed3dSBarry Smith 5953a40ed3dSBarry Smith PetscFunctionBegin; 596c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 597c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 598d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5991ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 6001ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 6018b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One)); 6021ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6031ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 604dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 6053a40ed3dSBarry Smith PetscFunctionReturn(0); 606289bc588SBarry Smith } 607800995b7SMatthew Knepley 6084a2ae208SSatish Balay #undef __FUNCT__ 6094a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense" 610dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 611289bc588SBarry Smith { 612c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 61387828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0; 614dfbe8321SBarry Smith PetscErrorCode ierr; 6150805154bSBarry Smith PetscBLASInt m, n, _One=1; 6163a40ed3dSBarry Smith 6173a40ed3dSBarry Smith PetscFunctionBegin; 618c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 619c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 620d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 6211ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 6221ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 6238b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One)); 6241ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6251ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 626dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 6273a40ed3dSBarry Smith PetscFunctionReturn(0); 628289bc588SBarry Smith } 6296ee01492SSatish Balay 6304a2ae208SSatish Balay #undef __FUNCT__ 6314a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense" 632dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 633289bc588SBarry Smith { 634c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 63587828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0; 636dfbe8321SBarry Smith PetscErrorCode ierr; 6370805154bSBarry Smith PetscBLASInt m, n, _One=1; 6383a40ed3dSBarry Smith 6393a40ed3dSBarry Smith PetscFunctionBegin; 640c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 641c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 642d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 643600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 6441ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 6451ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 6468b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 6471ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6481ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 649dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 6503a40ed3dSBarry Smith PetscFunctionReturn(0); 651289bc588SBarry Smith } 6526ee01492SSatish Balay 6534a2ae208SSatish Balay #undef __FUNCT__ 6544a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense" 655dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 656289bc588SBarry Smith { 657c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 65887828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 659dfbe8321SBarry Smith PetscErrorCode ierr; 6600805154bSBarry Smith PetscBLASInt m, n, _One=1; 66187828ca2SBarry Smith PetscScalar _DOne=1.0; 6623a40ed3dSBarry Smith 6633a40ed3dSBarry Smith PetscFunctionBegin; 664c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 665c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 666d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 667600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 6681ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 6691ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 6708b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 6711ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6721ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 673dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 6743a40ed3dSBarry Smith PetscFunctionReturn(0); 675289bc588SBarry Smith } 676289bc588SBarry Smith 677289bc588SBarry Smith /* -----------------------------------------------------------------*/ 6784a2ae208SSatish Balay #undef __FUNCT__ 6794a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense" 68013f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 681289bc588SBarry Smith { 682c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 68387828ca2SBarry Smith PetscScalar *v; 6846849ba73SBarry Smith PetscErrorCode ierr; 68513f74950SBarry Smith PetscInt i; 68667e560aaSBarry Smith 6873a40ed3dSBarry Smith PetscFunctionBegin; 688d0f46423SBarry Smith *ncols = A->cmap->n; 689289bc588SBarry Smith if (cols) { 690785e854fSJed Brown ierr = PetscMalloc1((A->cmap->n+1),cols);CHKERRQ(ierr); 691d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 692289bc588SBarry Smith } 693289bc588SBarry Smith if (vals) { 694785e854fSJed Brown ierr = PetscMalloc1((A->cmap->n+1),vals);CHKERRQ(ierr); 695289bc588SBarry Smith v = mat->v + row; 696d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 697289bc588SBarry Smith } 6983a40ed3dSBarry Smith PetscFunctionReturn(0); 699289bc588SBarry Smith } 7006ee01492SSatish Balay 7014a2ae208SSatish Balay #undef __FUNCT__ 7024a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense" 70313f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 704289bc588SBarry Smith { 705dfbe8321SBarry Smith PetscErrorCode ierr; 7066e111a19SKarl Rupp 707606d414cSSatish Balay PetscFunctionBegin; 708606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 709606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 7103a40ed3dSBarry Smith PetscFunctionReturn(0); 711289bc588SBarry Smith } 712289bc588SBarry Smith /* ----------------------------------------------------------------*/ 7134a2ae208SSatish Balay #undef __FUNCT__ 7144a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense" 71513f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 716289bc588SBarry Smith { 717c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 71813f74950SBarry Smith PetscInt i,j,idx=0; 719d6dfbf8fSBarry Smith 7203a40ed3dSBarry Smith PetscFunctionBegin; 721289bc588SBarry Smith if (!mat->roworiented) { 722dbb450caSBarry Smith if (addv == INSERT_VALUES) { 723289bc588SBarry Smith for (j=0; j<n; j++) { 724cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 7252515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 726e32f2f54SBarry 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); 72758804f6dSBarry Smith #endif 728289bc588SBarry Smith for (i=0; i<m; i++) { 729cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 7302515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 731e32f2f54SBarry 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); 73258804f6dSBarry Smith #endif 733cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 734289bc588SBarry Smith } 735289bc588SBarry Smith } 7363a40ed3dSBarry Smith } else { 737289bc588SBarry Smith for (j=0; j<n; j++) { 738cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 7392515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 740e32f2f54SBarry 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); 74158804f6dSBarry Smith #endif 742289bc588SBarry Smith for (i=0; i<m; i++) { 743cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 7442515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 745e32f2f54SBarry 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); 74658804f6dSBarry Smith #endif 747cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 748289bc588SBarry Smith } 749289bc588SBarry Smith } 750289bc588SBarry Smith } 7513a40ed3dSBarry Smith } else { 752dbb450caSBarry Smith if (addv == INSERT_VALUES) { 753e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 754cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 7552515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 756e32f2f54SBarry 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); 75758804f6dSBarry Smith #endif 758e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 759cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 7602515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 761e32f2f54SBarry 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); 76258804f6dSBarry Smith #endif 763cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 764e8d4e0b9SBarry Smith } 765e8d4e0b9SBarry Smith } 7663a40ed3dSBarry Smith } else { 767289bc588SBarry Smith for (i=0; i<m; i++) { 768cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 7692515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 770e32f2f54SBarry 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); 77158804f6dSBarry Smith #endif 772289bc588SBarry Smith for (j=0; j<n; j++) { 773cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 7742515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 775e32f2f54SBarry 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); 77658804f6dSBarry Smith #endif 777cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 778289bc588SBarry Smith } 779289bc588SBarry Smith } 780289bc588SBarry Smith } 781e8d4e0b9SBarry Smith } 7823a40ed3dSBarry Smith PetscFunctionReturn(0); 783289bc588SBarry Smith } 784e8d4e0b9SBarry Smith 7854a2ae208SSatish Balay #undef __FUNCT__ 7864a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense" 78713f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 788ae80bb75SLois Curfman McInnes { 789ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 79013f74950SBarry Smith PetscInt i,j; 791ae80bb75SLois Curfman McInnes 7923a40ed3dSBarry Smith PetscFunctionBegin; 793ae80bb75SLois Curfman McInnes /* row-oriented output */ 794ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 79597e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 796e32f2f54SBarry 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); 797ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 7986f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 799e32f2f54SBarry 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); 80097e567efSBarry Smith *v++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 801ae80bb75SLois Curfman McInnes } 802ae80bb75SLois Curfman McInnes } 8033a40ed3dSBarry Smith PetscFunctionReturn(0); 804ae80bb75SLois Curfman McInnes } 805ae80bb75SLois Curfman McInnes 806289bc588SBarry Smith /* -----------------------------------------------------------------*/ 807289bc588SBarry Smith 8084a2ae208SSatish Balay #undef __FUNCT__ 8095bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense" 810112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer) 811aabbc4fbSShri Abhyankar { 812aabbc4fbSShri Abhyankar Mat_SeqDense *a; 813aabbc4fbSShri Abhyankar PetscErrorCode ierr; 814aabbc4fbSShri Abhyankar PetscInt *scols,i,j,nz,header[4]; 815aabbc4fbSShri Abhyankar int fd; 816aabbc4fbSShri Abhyankar PetscMPIInt size; 817aabbc4fbSShri Abhyankar PetscInt *rowlengths = 0,M,N,*cols,grows,gcols; 818aabbc4fbSShri Abhyankar PetscScalar *vals,*svals,*v,*w; 819ce94432eSBarry Smith MPI_Comm comm; 820aabbc4fbSShri Abhyankar 821aabbc4fbSShri Abhyankar PetscFunctionBegin; 822ce94432eSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 823aabbc4fbSShri Abhyankar ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 824aabbc4fbSShri Abhyankar if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor"); 825aabbc4fbSShri Abhyankar ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 826aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 827aabbc4fbSShri Abhyankar if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 828aabbc4fbSShri Abhyankar M = header[1]; N = header[2]; nz = header[3]; 829aabbc4fbSShri Abhyankar 830aabbc4fbSShri Abhyankar /* set global size if not set already*/ 831aabbc4fbSShri Abhyankar if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) { 832aabbc4fbSShri Abhyankar ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr); 833aabbc4fbSShri Abhyankar } else { 834aabbc4fbSShri Abhyankar /* if sizes and type are already set, check if the vector global sizes are correct */ 835aabbc4fbSShri Abhyankar ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr); 836aabbc4fbSShri 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); 837aabbc4fbSShri Abhyankar } 8380298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 839aabbc4fbSShri Abhyankar 840aabbc4fbSShri Abhyankar if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 841aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 842aabbc4fbSShri Abhyankar v = a->v; 843aabbc4fbSShri Abhyankar /* Allocate some temp space to read in the values and then flip them 844aabbc4fbSShri Abhyankar from row major to column major */ 845785e854fSJed Brown ierr = PetscMalloc1((M*N > 0 ? M*N : 1),&w);CHKERRQ(ierr); 846aabbc4fbSShri Abhyankar /* read in nonzero values */ 847aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 848aabbc4fbSShri Abhyankar /* now flip the values and store them in the matrix*/ 849aabbc4fbSShri Abhyankar for (j=0; j<N; j++) { 850aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 851aabbc4fbSShri Abhyankar *v++ =w[i*N+j]; 852aabbc4fbSShri Abhyankar } 853aabbc4fbSShri Abhyankar } 854aabbc4fbSShri Abhyankar ierr = PetscFree(w);CHKERRQ(ierr); 855aabbc4fbSShri Abhyankar } else { 856aabbc4fbSShri Abhyankar /* read row lengths */ 857785e854fSJed Brown ierr = PetscMalloc1((M+1),&rowlengths);CHKERRQ(ierr); 858aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 859aabbc4fbSShri Abhyankar 860aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 861aabbc4fbSShri Abhyankar v = a->v; 862aabbc4fbSShri Abhyankar 863aabbc4fbSShri Abhyankar /* read column indices and nonzeros */ 864785e854fSJed Brown ierr = PetscMalloc1((nz+1),&scols);CHKERRQ(ierr); 865aabbc4fbSShri Abhyankar cols = scols; 866aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 867785e854fSJed Brown ierr = PetscMalloc1((nz+1),&svals);CHKERRQ(ierr); 868aabbc4fbSShri Abhyankar vals = svals; 869aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 870aabbc4fbSShri Abhyankar 871aabbc4fbSShri Abhyankar /* insert into matrix */ 872aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 873aabbc4fbSShri Abhyankar for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 874aabbc4fbSShri Abhyankar svals += rowlengths[i]; scols += rowlengths[i]; 875aabbc4fbSShri Abhyankar } 876aabbc4fbSShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 877aabbc4fbSShri Abhyankar ierr = PetscFree(cols);CHKERRQ(ierr); 878aabbc4fbSShri Abhyankar ierr = PetscFree(rowlengths);CHKERRQ(ierr); 879aabbc4fbSShri Abhyankar } 880aabbc4fbSShri Abhyankar ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 881aabbc4fbSShri Abhyankar ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 882aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 883aabbc4fbSShri Abhyankar } 884aabbc4fbSShri Abhyankar 885aabbc4fbSShri Abhyankar #undef __FUNCT__ 8864a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII" 8876849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 888289bc588SBarry Smith { 889932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 890dfbe8321SBarry Smith PetscErrorCode ierr; 89113f74950SBarry Smith PetscInt i,j; 8922dcb1b2aSMatthew Knepley const char *name; 89387828ca2SBarry Smith PetscScalar *v; 894f3ef73ceSBarry Smith PetscViewerFormat format; 8955f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 896ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 8975f481a85SSatish Balay #endif 898932b0c3eSLois Curfman McInnes 8993a40ed3dSBarry Smith PetscFunctionBegin; 900b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 901456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 9023a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 903fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 904d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 905d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 90644cd7ae7SLois Curfman McInnes v = a->v + i; 90777431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 908d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 909aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 910329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 91157622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 912329f5518SBarry Smith } else if (PetscRealPart(*v)) { 91357622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr); 9146831982aSBarry Smith } 91580cd9d93SLois Curfman McInnes #else 9166831982aSBarry Smith if (*v) { 91757622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr); 9186831982aSBarry Smith } 91980cd9d93SLois Curfman McInnes #endif 9201b807ce4Svictorle v += a->lda; 92180cd9d93SLois Curfman McInnes } 922b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 92380cd9d93SLois Curfman McInnes } 924d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 9253a40ed3dSBarry Smith } else { 926d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 927aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 92847989497SBarry Smith /* determine if matrix has all real values */ 92947989497SBarry Smith v = a->v; 930d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 931ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;} 93247989497SBarry Smith } 93347989497SBarry Smith #endif 934fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 9353a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 936d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 937d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 938fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 939ffac6cdbSBarry Smith } 940ffac6cdbSBarry Smith 941d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 942932b0c3eSLois Curfman McInnes v = a->v + i; 943d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 944aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 94547989497SBarry Smith if (allreal) { 946c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr); 94747989497SBarry Smith } else { 948c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 94947989497SBarry Smith } 950289bc588SBarry Smith #else 951c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr); 952289bc588SBarry Smith #endif 9531b807ce4Svictorle v += a->lda; 954289bc588SBarry Smith } 955b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 956289bc588SBarry Smith } 957fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 958b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 959ffac6cdbSBarry Smith } 960d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 961da3a660dSBarry Smith } 962b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 9633a40ed3dSBarry Smith PetscFunctionReturn(0); 964289bc588SBarry Smith } 965289bc588SBarry Smith 9664a2ae208SSatish Balay #undef __FUNCT__ 9674a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary" 9686849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 969932b0c3eSLois Curfman McInnes { 970932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 9716849ba73SBarry Smith PetscErrorCode ierr; 97213f74950SBarry Smith int fd; 973d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 974f4403165SShri Abhyankar PetscScalar *v,*anonz,*vals; 975f4403165SShri Abhyankar PetscViewerFormat format; 976932b0c3eSLois Curfman McInnes 9773a40ed3dSBarry Smith PetscFunctionBegin; 978b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 97990ace30eSBarry Smith 980f4403165SShri Abhyankar ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 981f4403165SShri Abhyankar if (format == PETSC_VIEWER_NATIVE) { 982f4403165SShri Abhyankar /* store the matrix as a dense matrix */ 983785e854fSJed Brown ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr); 9842205254eSKarl Rupp 985f4403165SShri Abhyankar col_lens[0] = MAT_FILE_CLASSID; 986f4403165SShri Abhyankar col_lens[1] = m; 987f4403165SShri Abhyankar col_lens[2] = n; 988f4403165SShri Abhyankar col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 9892205254eSKarl Rupp 990f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 991f4403165SShri Abhyankar ierr = PetscFree(col_lens);CHKERRQ(ierr); 992f4403165SShri Abhyankar 993f4403165SShri Abhyankar /* write out matrix, by rows */ 994785e854fSJed Brown ierr = PetscMalloc1((m*n+1),&vals);CHKERRQ(ierr); 995f4403165SShri Abhyankar v = a->v; 996f4403165SShri Abhyankar for (j=0; j<n; j++) { 997f4403165SShri Abhyankar for (i=0; i<m; i++) { 998f4403165SShri Abhyankar vals[j + i*n] = *v++; 999f4403165SShri Abhyankar } 1000f4403165SShri Abhyankar } 1001f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1002f4403165SShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1003f4403165SShri Abhyankar } else { 1004785e854fSJed Brown ierr = PetscMalloc1((4+nz),&col_lens);CHKERRQ(ierr); 10052205254eSKarl Rupp 10060700a824SBarry Smith col_lens[0] = MAT_FILE_CLASSID; 1007932b0c3eSLois Curfman McInnes col_lens[1] = m; 1008932b0c3eSLois Curfman McInnes col_lens[2] = n; 1009932b0c3eSLois Curfman McInnes col_lens[3] = nz; 1010932b0c3eSLois Curfman McInnes 1011932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 1012932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 10136f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1014932b0c3eSLois Curfman McInnes 1015932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 1016932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 1017932b0c3eSLois Curfman McInnes ict = 0; 1018932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1019932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 1020932b0c3eSLois Curfman McInnes } 10216f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 1022606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 1023932b0c3eSLois Curfman McInnes 1024932b0c3eSLois Curfman McInnes /* store nonzero values */ 1025785e854fSJed Brown ierr = PetscMalloc1((nz+1),&anonz);CHKERRQ(ierr); 1026932b0c3eSLois Curfman McInnes ict = 0; 1027932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1028932b0c3eSLois Curfman McInnes v = a->v + i; 1029932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 10301b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 1031932b0c3eSLois Curfman McInnes } 1032932b0c3eSLois Curfman McInnes } 10336f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1034606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 1035f4403165SShri Abhyankar } 10363a40ed3dSBarry Smith PetscFunctionReturn(0); 1037932b0c3eSLois Curfman McInnes } 1038932b0c3eSLois Curfman McInnes 10399804daf3SBarry Smith #include <petscdraw.h> 10404a2ae208SSatish Balay #undef __FUNCT__ 10414a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom" 1042dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1043f1af5d2fSBarry Smith { 1044f1af5d2fSBarry Smith Mat A = (Mat) Aa; 1045f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 10466849ba73SBarry Smith PetscErrorCode ierr; 1047d0f46423SBarry Smith PetscInt m = A->rmap->n,n = A->cmap->n,color,i,j; 104887828ca2SBarry Smith PetscScalar *v = a->v; 1049b0a32e0cSBarry Smith PetscViewer viewer; 1050b0a32e0cSBarry Smith PetscDraw popup; 1051329f5518SBarry Smith PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0; 1052f3ef73ceSBarry Smith PetscViewerFormat format; 1053f1af5d2fSBarry Smith 1054f1af5d2fSBarry Smith PetscFunctionBegin; 1055f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1056b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1057b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1058f1af5d2fSBarry Smith 1059f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1060fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1061f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1062b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1063f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1064f1af5d2fSBarry Smith x_l = j; 1065f1af5d2fSBarry Smith x_r = x_l + 1.0; 1066f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1067f1af5d2fSBarry Smith y_l = m - i - 1.0; 1068f1af5d2fSBarry Smith y_r = y_l + 1.0; 1069329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1070b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1071329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1072b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1073f1af5d2fSBarry Smith } else { 1074f1af5d2fSBarry Smith continue; 1075f1af5d2fSBarry Smith } 1076b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1077f1af5d2fSBarry Smith } 1078f1af5d2fSBarry Smith } 1079f1af5d2fSBarry Smith } else { 1080f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1081f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1082f1af5d2fSBarry Smith for (i = 0; i < m*n; i++) { 1083f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1084f1af5d2fSBarry Smith } 1085b0a32e0cSBarry Smith scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv; 1086b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 1087b0a32e0cSBarry Smith if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);} 1088f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1089f1af5d2fSBarry Smith x_l = j; 1090f1af5d2fSBarry Smith x_r = x_l + 1.0; 1091f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1092f1af5d2fSBarry Smith y_l = m - i - 1.0; 1093f1af5d2fSBarry Smith y_r = y_l + 1.0; 1094b0a32e0cSBarry Smith color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i])); 1095b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1096f1af5d2fSBarry Smith } 1097f1af5d2fSBarry Smith } 1098f1af5d2fSBarry Smith } 1099f1af5d2fSBarry Smith PetscFunctionReturn(0); 1100f1af5d2fSBarry Smith } 1101f1af5d2fSBarry Smith 11024a2ae208SSatish Balay #undef __FUNCT__ 11034a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 1104dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1105f1af5d2fSBarry Smith { 1106b0a32e0cSBarry Smith PetscDraw draw; 1107ace3abfcSBarry Smith PetscBool isnull; 1108329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1109dfbe8321SBarry Smith PetscErrorCode ierr; 1110f1af5d2fSBarry Smith 1111f1af5d2fSBarry Smith PetscFunctionBegin; 1112b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1113b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1114abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1115f1af5d2fSBarry Smith 1116f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1117d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1118f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1119b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1120b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 11210298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1122f1af5d2fSBarry Smith PetscFunctionReturn(0); 1123f1af5d2fSBarry Smith } 1124f1af5d2fSBarry Smith 11254a2ae208SSatish Balay #undef __FUNCT__ 11264a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 1127dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1128932b0c3eSLois Curfman McInnes { 1129dfbe8321SBarry Smith PetscErrorCode ierr; 1130ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1131932b0c3eSLois Curfman McInnes 11323a40ed3dSBarry Smith PetscFunctionBegin; 1133251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1134251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1135251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 11360f5bd95cSBarry Smith 1137c45a1595SBarry Smith if (iascii) { 1138c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 11390f5bd95cSBarry Smith } else if (isbinary) { 11403a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1141f1af5d2fSBarry Smith } else if (isdraw) { 1142f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1143932b0c3eSLois Curfman McInnes } 11443a40ed3dSBarry Smith PetscFunctionReturn(0); 1145932b0c3eSLois Curfman McInnes } 1146289bc588SBarry Smith 11474a2ae208SSatish Balay #undef __FUNCT__ 11484a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1149dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat) 1150289bc588SBarry Smith { 1151ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1152dfbe8321SBarry Smith PetscErrorCode ierr; 115390f02eecSBarry Smith 11543a40ed3dSBarry Smith PetscFunctionBegin; 1155aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1156d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1157a5a9c739SBarry Smith #endif 115805b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 11596857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1160bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1161dbd8c25aSHong Zhang 1162dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1163bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 1164bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 11658baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 11668baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 11678baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 11688baccfbdSHong Zhang #endif 11698baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatGetFactor_petsc_C",NULL);CHKERRQ(ierr); 1170bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 1171bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1172bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1173bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 11743bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 11753bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 11763bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 11773a40ed3dSBarry Smith PetscFunctionReturn(0); 1178289bc588SBarry Smith } 1179289bc588SBarry Smith 11804a2ae208SSatish Balay #undef __FUNCT__ 11814a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1182fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1183289bc588SBarry Smith { 1184c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 11856849ba73SBarry Smith PetscErrorCode ierr; 118613f74950SBarry Smith PetscInt k,j,m,n,M; 118787828ca2SBarry Smith PetscScalar *v,tmp; 118848b35521SBarry Smith 11893a40ed3dSBarry Smith PetscFunctionBegin; 1190d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 1191e9695a30SBarry Smith if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */ 1192e7e72b3dSBarry Smith if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1193e7e72b3dSBarry Smith else { 1194d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1195289bc588SBarry Smith for (k=0; k<j; k++) { 11961b807ce4Svictorle tmp = v[j + k*M]; 11971b807ce4Svictorle v[j + k*M] = v[k + j*M]; 11981b807ce4Svictorle v[k + j*M] = tmp; 1199289bc588SBarry Smith } 1200289bc588SBarry Smith } 1201d64ed03dSBarry Smith } 12023a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1203d3e5ee88SLois Curfman McInnes Mat tmat; 1204ec8511deSBarry Smith Mat_SeqDense *tmatd; 120587828ca2SBarry Smith PetscScalar *v2; 1206ea709b57SSatish Balay 1207fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX) { 1208ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1209d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 12107adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 12110298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1212fc4dec0aSBarry Smith } else { 1213fc4dec0aSBarry Smith tmat = *matout; 1214fc4dec0aSBarry Smith } 1215ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 12160de55854SLois Curfman McInnes v = mat->v; v2 = tmatd->v; 1217d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 12181b807ce4Svictorle for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M]; 1219d3e5ee88SLois Curfman McInnes } 12206d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 12216d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1222d3e5ee88SLois Curfman McInnes *matout = tmat; 122348b35521SBarry Smith } 12243a40ed3dSBarry Smith PetscFunctionReturn(0); 1225289bc588SBarry Smith } 1226289bc588SBarry Smith 12274a2ae208SSatish Balay #undef __FUNCT__ 12284a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1229ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1230289bc588SBarry Smith { 1231c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1232c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 123313f74950SBarry Smith PetscInt i,j; 1234a2ea699eSBarry Smith PetscScalar *v1,*v2; 12359ea5d5aeSSatish Balay 12363a40ed3dSBarry Smith PetscFunctionBegin; 1237d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1238d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1239d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 12401b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1241d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 12423a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 12431b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 12441b807ce4Svictorle } 1245289bc588SBarry Smith } 124677c4ece6SBarry Smith *flg = PETSC_TRUE; 12473a40ed3dSBarry Smith PetscFunctionReturn(0); 1248289bc588SBarry Smith } 1249289bc588SBarry Smith 12504a2ae208SSatish Balay #undef __FUNCT__ 12514a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1252dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1253289bc588SBarry Smith { 1254c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1255dfbe8321SBarry Smith PetscErrorCode ierr; 125613f74950SBarry Smith PetscInt i,n,len; 125787828ca2SBarry Smith PetscScalar *x,zero = 0.0; 125844cd7ae7SLois Curfman McInnes 12593a40ed3dSBarry Smith PetscFunctionBegin; 12602dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 12617a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 12621ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1263d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1264e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 126544cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 12661b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1267289bc588SBarry Smith } 12681ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 12693a40ed3dSBarry Smith PetscFunctionReturn(0); 1270289bc588SBarry Smith } 1271289bc588SBarry Smith 12724a2ae208SSatish Balay #undef __FUNCT__ 12734a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1274dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1275289bc588SBarry Smith { 1276c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 127787828ca2SBarry Smith PetscScalar *l,*r,x,*v; 1278dfbe8321SBarry Smith PetscErrorCode ierr; 1279d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 128055659b69SBarry Smith 12813a40ed3dSBarry Smith PetscFunctionBegin; 128228988994SBarry Smith if (ll) { 12837a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 12841ebc52fbSHong Zhang ierr = VecGetArray(ll,&l);CHKERRQ(ierr); 1285e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1286da3a660dSBarry Smith for (i=0; i<m; i++) { 1287da3a660dSBarry Smith x = l[i]; 1288da3a660dSBarry Smith v = mat->v + i; 1289da3a660dSBarry Smith for (j=0; j<n; j++) { (*v) *= x; v+= m;} 1290da3a660dSBarry Smith } 12911ebc52fbSHong Zhang ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr); 1292*eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1293da3a660dSBarry Smith } 129428988994SBarry Smith if (rr) { 12957a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 12961ebc52fbSHong Zhang ierr = VecGetArray(rr,&r);CHKERRQ(ierr); 1297e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1298da3a660dSBarry Smith for (i=0; i<n; i++) { 1299da3a660dSBarry Smith x = r[i]; 1300da3a660dSBarry Smith v = mat->v + i*m; 13012205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1302da3a660dSBarry Smith } 13031ebc52fbSHong Zhang ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr); 1304*eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1305da3a660dSBarry Smith } 13063a40ed3dSBarry Smith PetscFunctionReturn(0); 1307289bc588SBarry Smith } 1308289bc588SBarry Smith 13094a2ae208SSatish Balay #undef __FUNCT__ 13104a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1311dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1312289bc588SBarry Smith { 1313c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 131487828ca2SBarry Smith PetscScalar *v = mat->v; 1315329f5518SBarry Smith PetscReal sum = 0.0; 1316d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1317efee365bSSatish Balay PetscErrorCode ierr; 131855659b69SBarry Smith 13193a40ed3dSBarry Smith PetscFunctionBegin; 1320289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1321a5ce6ee0Svictorle if (lda>m) { 1322d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1323a5ce6ee0Svictorle v = mat->v+j*lda; 1324a5ce6ee0Svictorle for (i=0; i<m; i++) { 1325a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1326a5ce6ee0Svictorle } 1327a5ce6ee0Svictorle } 1328a5ce6ee0Svictorle } else { 1329d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1330329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1331289bc588SBarry Smith } 1332a5ce6ee0Svictorle } 13338f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1334dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13353a40ed3dSBarry Smith } else if (type == NORM_1) { 1336064f8208SBarry Smith *nrm = 0.0; 1337d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 13381b807ce4Svictorle v = mat->v + j*mat->lda; 1339289bc588SBarry Smith sum = 0.0; 1340d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 134133a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1342289bc588SBarry Smith } 1343064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1344289bc588SBarry Smith } 1345*eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13463a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1347064f8208SBarry Smith *nrm = 0.0; 1348d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1349289bc588SBarry Smith v = mat->v + j; 1350289bc588SBarry Smith sum = 0.0; 1351d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 13521b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1353289bc588SBarry Smith } 1354064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1355289bc588SBarry Smith } 1356*eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1357e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 13583a40ed3dSBarry Smith PetscFunctionReturn(0); 1359289bc588SBarry Smith } 1360289bc588SBarry Smith 13614a2ae208SSatish Balay #undef __FUNCT__ 13624a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1363ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1364289bc588SBarry Smith { 1365c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 136663ba0a88SBarry Smith PetscErrorCode ierr; 136767e560aaSBarry Smith 13683a40ed3dSBarry Smith PetscFunctionBegin; 1369b5a2b587SKris Buschelman switch (op) { 1370b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 13714e0d8c25SBarry Smith aij->roworiented = flg; 1372b5a2b587SKris Buschelman break; 1373512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1374b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 13753971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 13764e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 137713fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1378b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1379b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 13805021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 13815021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 13825021d80fSJed Brown break; 13835021d80fSJed Brown case MAT_SPD: 138477e54ba9SKris Buschelman case MAT_SYMMETRIC: 138577e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 13869a4540c5SBarry Smith case MAT_HERMITIAN: 13879a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 13885021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 138977e54ba9SKris Buschelman break; 1390b5a2b587SKris Buschelman default: 1391e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 13923a40ed3dSBarry Smith } 13933a40ed3dSBarry Smith PetscFunctionReturn(0); 1394289bc588SBarry Smith } 1395289bc588SBarry Smith 13964a2ae208SSatish Balay #undef __FUNCT__ 13974a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1398dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A) 13996f0a148fSBarry Smith { 1400ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 14016849ba73SBarry Smith PetscErrorCode ierr; 1402d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 14033a40ed3dSBarry Smith 14043a40ed3dSBarry Smith PetscFunctionBegin; 1405a5ce6ee0Svictorle if (lda>m) { 1406d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1407a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1408a5ce6ee0Svictorle } 1409a5ce6ee0Svictorle } else { 1410d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1411a5ce6ee0Svictorle } 14123a40ed3dSBarry Smith PetscFunctionReturn(0); 14136f0a148fSBarry Smith } 14146f0a148fSBarry Smith 14154a2ae208SSatish Balay #undef __FUNCT__ 14164a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 14172b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 14186f0a148fSBarry Smith { 141997b48c8fSBarry Smith PetscErrorCode ierr; 1420ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1421b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 142297b48c8fSBarry Smith PetscScalar *slot,*bb; 142397b48c8fSBarry Smith const PetscScalar *xx; 142455659b69SBarry Smith 14253a40ed3dSBarry Smith PetscFunctionBegin; 1426b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1427b9679d65SBarry Smith for (i=0; i<N; i++) { 1428b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1429b9679d65SBarry 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); 1430b9679d65SBarry Smith } 1431b9679d65SBarry Smith #endif 1432b9679d65SBarry Smith 143397b48c8fSBarry Smith /* fix right hand side if needed */ 143497b48c8fSBarry Smith if (x && b) { 143597b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 143697b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 14372205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 143897b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 143997b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 144097b48c8fSBarry Smith } 144197b48c8fSBarry Smith 14426f0a148fSBarry Smith for (i=0; i<N; i++) { 14436f0a148fSBarry Smith slot = l->v + rows[i]; 1444b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 14456f0a148fSBarry Smith } 1446f4df32b1SMatthew Knepley if (diag != 0.0) { 1447b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 14486f0a148fSBarry Smith for (i=0; i<N; i++) { 1449b9679d65SBarry Smith slot = l->v + (m+1)*rows[i]; 1450f4df32b1SMatthew Knepley *slot = diag; 14516f0a148fSBarry Smith } 14526f0a148fSBarry Smith } 14533a40ed3dSBarry Smith PetscFunctionReturn(0); 14546f0a148fSBarry Smith } 1455557bce09SLois Curfman McInnes 14564a2ae208SSatish Balay #undef __FUNCT__ 14578c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense" 14588c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[]) 145964e87e97SBarry Smith { 1460c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 14613a40ed3dSBarry Smith 14623a40ed3dSBarry Smith PetscFunctionBegin; 1463e32f2f54SBarry 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"); 146464e87e97SBarry Smith *array = mat->v; 14653a40ed3dSBarry Smith PetscFunctionReturn(0); 146664e87e97SBarry Smith } 14670754003eSLois Curfman McInnes 14684a2ae208SSatish Balay #undef __FUNCT__ 14698c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense" 14708c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1471ff14e315SSatish Balay { 14723a40ed3dSBarry Smith PetscFunctionBegin; 147309b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 14743a40ed3dSBarry Smith PetscFunctionReturn(0); 1475ff14e315SSatish Balay } 14760754003eSLois Curfman McInnes 14774a2ae208SSatish Balay #undef __FUNCT__ 14788c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray" 1479dec5eb66SMatthew G Knepley /*@C 14808c778c55SBarry Smith MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored 148173a71a0fSBarry Smith 148273a71a0fSBarry Smith Not Collective 148373a71a0fSBarry Smith 148473a71a0fSBarry Smith Input Parameter: 1485579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 148673a71a0fSBarry Smith 148773a71a0fSBarry Smith Output Parameter: 148873a71a0fSBarry Smith . array - pointer to the data 148973a71a0fSBarry Smith 149073a71a0fSBarry Smith Level: intermediate 149173a71a0fSBarry Smith 14928c778c55SBarry Smith .seealso: MatDenseRestoreArray() 149373a71a0fSBarry Smith @*/ 14948c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 149573a71a0fSBarry Smith { 149673a71a0fSBarry Smith PetscErrorCode ierr; 149773a71a0fSBarry Smith 149873a71a0fSBarry Smith PetscFunctionBegin; 14998c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 150073a71a0fSBarry Smith PetscFunctionReturn(0); 150173a71a0fSBarry Smith } 150273a71a0fSBarry Smith 150373a71a0fSBarry Smith #undef __FUNCT__ 15048c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray" 1505dec5eb66SMatthew G Knepley /*@C 1506579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 150773a71a0fSBarry Smith 150873a71a0fSBarry Smith Not Collective 150973a71a0fSBarry Smith 151073a71a0fSBarry Smith Input Parameters: 1511579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 151273a71a0fSBarry Smith . array - pointer to the data 151373a71a0fSBarry Smith 151473a71a0fSBarry Smith Level: intermediate 151573a71a0fSBarry Smith 15168c778c55SBarry Smith .seealso: MatDenseGetArray() 151773a71a0fSBarry Smith @*/ 15188c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 151973a71a0fSBarry Smith { 152073a71a0fSBarry Smith PetscErrorCode ierr; 152173a71a0fSBarry Smith 152273a71a0fSBarry Smith PetscFunctionBegin; 15238c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 152473a71a0fSBarry Smith PetscFunctionReturn(0); 152573a71a0fSBarry Smith } 152673a71a0fSBarry Smith 152773a71a0fSBarry Smith #undef __FUNCT__ 15284a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 152913f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 15300754003eSLois Curfman McInnes { 1531c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 15326849ba73SBarry Smith PetscErrorCode ierr; 15335d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 15345d0c19d7SBarry Smith const PetscInt *irow,*icol; 153587828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 15360754003eSLois Curfman McInnes Mat newmat; 15370754003eSLois Curfman McInnes 15383a40ed3dSBarry Smith PetscFunctionBegin; 153978b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 154078b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1541e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1542e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 15430754003eSLois Curfman McInnes 1544182d2002SSatish Balay /* Check submatrixcall */ 1545182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 154613f74950SBarry Smith PetscInt n_cols,n_rows; 1547182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 154821a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1549f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1550c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 155121a2c019SBarry Smith } 1552182d2002SSatish Balay newmat = *B; 1553182d2002SSatish Balay } else { 15540754003eSLois Curfman McInnes /* Create and fill new matrix */ 1555ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 1556f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 15577adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 15580298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1559182d2002SSatish Balay } 1560182d2002SSatish Balay 1561182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1562182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1563182d2002SSatish Balay 1564182d2002SSatish Balay for (i=0; i<ncols; i++) { 15656de62eeeSBarry Smith av = v + mat->lda*icol[i]; 15662205254eSKarl Rupp for (j=0; j<nrows; j++) *bv++ = av[irow[j]]; 15670754003eSLois Curfman McInnes } 1568182d2002SSatish Balay 1569182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 15706d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15716d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15720754003eSLois Curfman McInnes 15730754003eSLois Curfman McInnes /* Free work space */ 157478b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 157578b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1576182d2002SSatish Balay *B = newmat; 15773a40ed3dSBarry Smith PetscFunctionReturn(0); 15780754003eSLois Curfman McInnes } 15790754003eSLois Curfman McInnes 15804a2ae208SSatish Balay #undef __FUNCT__ 15814a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 158213f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1583905e6a2fSBarry Smith { 15846849ba73SBarry Smith PetscErrorCode ierr; 158513f74950SBarry Smith PetscInt i; 1586905e6a2fSBarry Smith 15873a40ed3dSBarry Smith PetscFunctionBegin; 1588905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1589785e854fSJed Brown ierr = PetscMalloc1((n+1),B);CHKERRQ(ierr); 1590905e6a2fSBarry Smith } 1591905e6a2fSBarry Smith 1592905e6a2fSBarry Smith for (i=0; i<n; i++) { 15936a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1594905e6a2fSBarry Smith } 15953a40ed3dSBarry Smith PetscFunctionReturn(0); 1596905e6a2fSBarry Smith } 1597905e6a2fSBarry Smith 15984a2ae208SSatish Balay #undef __FUNCT__ 1599c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1600c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1601c0aa2d19SHong Zhang { 1602c0aa2d19SHong Zhang PetscFunctionBegin; 1603c0aa2d19SHong Zhang PetscFunctionReturn(0); 1604c0aa2d19SHong Zhang } 1605c0aa2d19SHong Zhang 1606c0aa2d19SHong Zhang #undef __FUNCT__ 1607c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1608c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1609c0aa2d19SHong Zhang { 1610c0aa2d19SHong Zhang PetscFunctionBegin; 1611c0aa2d19SHong Zhang PetscFunctionReturn(0); 1612c0aa2d19SHong Zhang } 1613c0aa2d19SHong Zhang 1614c0aa2d19SHong Zhang #undef __FUNCT__ 16154a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1616dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 16174b0e389bSBarry Smith { 16184b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 16196849ba73SBarry Smith PetscErrorCode ierr; 1620d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 16213a40ed3dSBarry Smith 16223a40ed3dSBarry Smith PetscFunctionBegin; 162333f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 162433f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1625cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 16263a40ed3dSBarry Smith PetscFunctionReturn(0); 16273a40ed3dSBarry Smith } 1628e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1629a5ce6ee0Svictorle if (lda1>m || lda2>m) { 16300dbb7854Svictorle for (j=0; j<n; j++) { 1631a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1632a5ce6ee0Svictorle } 1633a5ce6ee0Svictorle } else { 1634d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1635a5ce6ee0Svictorle } 1636273d9f13SBarry Smith PetscFunctionReturn(0); 1637273d9f13SBarry Smith } 1638273d9f13SBarry Smith 16394a2ae208SSatish Balay #undef __FUNCT__ 16404994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense" 16414994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A) 1642273d9f13SBarry Smith { 1643dfbe8321SBarry Smith PetscErrorCode ierr; 1644273d9f13SBarry Smith 1645273d9f13SBarry Smith PetscFunctionBegin; 1646273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 16473a40ed3dSBarry Smith PetscFunctionReturn(0); 16484b0e389bSBarry Smith } 16494b0e389bSBarry Smith 1650284134d9SBarry Smith #undef __FUNCT__ 1651ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense" 1652ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1653ba337c44SJed Brown { 1654ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1655ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1656ba337c44SJed Brown PetscScalar *aa = a->v; 1657ba337c44SJed Brown 1658ba337c44SJed Brown PetscFunctionBegin; 1659ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1660ba337c44SJed Brown PetscFunctionReturn(0); 1661ba337c44SJed Brown } 1662ba337c44SJed Brown 1663ba337c44SJed Brown #undef __FUNCT__ 1664ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense" 1665ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1666ba337c44SJed Brown { 1667ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1668ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1669ba337c44SJed Brown PetscScalar *aa = a->v; 1670ba337c44SJed Brown 1671ba337c44SJed Brown PetscFunctionBegin; 1672ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1673ba337c44SJed Brown PetscFunctionReturn(0); 1674ba337c44SJed Brown } 1675ba337c44SJed Brown 1676ba337c44SJed Brown #undef __FUNCT__ 1677ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense" 1678ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 1679ba337c44SJed Brown { 1680ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1681ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1682ba337c44SJed Brown PetscScalar *aa = a->v; 1683ba337c44SJed Brown 1684ba337c44SJed Brown PetscFunctionBegin; 1685ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 1686ba337c44SJed Brown PetscFunctionReturn(0); 1687ba337c44SJed Brown } 1688284134d9SBarry Smith 1689a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1690a9fe9ddaSSatish Balay #undef __FUNCT__ 1691a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1692a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1693a9fe9ddaSSatish Balay { 1694a9fe9ddaSSatish Balay PetscErrorCode ierr; 1695a9fe9ddaSSatish Balay 1696a9fe9ddaSSatish Balay PetscFunctionBegin; 1697a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 16983ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1699a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 17003ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1701a9fe9ddaSSatish Balay } 17023ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1703a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 17043ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1705a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1706a9fe9ddaSSatish Balay } 1707a9fe9ddaSSatish Balay 1708a9fe9ddaSSatish Balay #undef __FUNCT__ 1709a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1710a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1711a9fe9ddaSSatish Balay { 1712ee16a9a1SHong Zhang PetscErrorCode ierr; 1713d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1714ee16a9a1SHong Zhang Mat Cmat; 1715a9fe9ddaSSatish Balay 1716ee16a9a1SHong Zhang PetscFunctionBegin; 1717e32f2f54SBarry 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); 1718ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1719ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1720ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 17210298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 1722d73949e8SHong Zhang 1723ee16a9a1SHong Zhang *C = Cmat; 1724ee16a9a1SHong Zhang PetscFunctionReturn(0); 1725ee16a9a1SHong Zhang } 1726a9fe9ddaSSatish Balay 172798a3b096SSatish Balay #undef __FUNCT__ 1728a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1729a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1730a9fe9ddaSSatish Balay { 1731a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1732a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1733a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 17340805154bSBarry Smith PetscBLASInt m,n,k; 1735a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1736c5df96a5SBarry Smith PetscErrorCode ierr; 1737a9fe9ddaSSatish Balay 1738a9fe9ddaSSatish Balay PetscFunctionBegin; 1739c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1740c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1741c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 17428b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1743a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1744a9fe9ddaSSatish Balay } 1745a9fe9ddaSSatish Balay 1746a9fe9ddaSSatish Balay #undef __FUNCT__ 174775648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense" 174875648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1749a9fe9ddaSSatish Balay { 1750a9fe9ddaSSatish Balay PetscErrorCode ierr; 1751a9fe9ddaSSatish Balay 1752a9fe9ddaSSatish Balay PetscFunctionBegin; 1753a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 17543ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 175575648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 17563ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1757a9fe9ddaSSatish Balay } 17583ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 175975648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 17603ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1761a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1762a9fe9ddaSSatish Balay } 1763a9fe9ddaSSatish Balay 1764a9fe9ddaSSatish Balay #undef __FUNCT__ 176575648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense" 176675648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1767a9fe9ddaSSatish Balay { 1768ee16a9a1SHong Zhang PetscErrorCode ierr; 1769d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1770ee16a9a1SHong Zhang Mat Cmat; 1771a9fe9ddaSSatish Balay 1772ee16a9a1SHong Zhang PetscFunctionBegin; 1773e32f2f54SBarry 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); 1774ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1775ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1776ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 17770298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 17782205254eSKarl Rupp 1779ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 17802205254eSKarl Rupp 1781ee16a9a1SHong Zhang *C = Cmat; 1782ee16a9a1SHong Zhang PetscFunctionReturn(0); 1783ee16a9a1SHong Zhang } 1784a9fe9ddaSSatish Balay 1785a9fe9ddaSSatish Balay #undef __FUNCT__ 178675648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense" 178775648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1788a9fe9ddaSSatish Balay { 1789a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1790a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1791a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 17920805154bSBarry Smith PetscBLASInt m,n,k; 1793a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1794c5df96a5SBarry Smith PetscErrorCode ierr; 1795a9fe9ddaSSatish Balay 1796a9fe9ddaSSatish Balay PetscFunctionBegin; 1797c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr); 1798c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1799c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 18002fbe02b9SBarry Smith /* 18012fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 18022fbe02b9SBarry Smith */ 18038b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1804a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1805a9fe9ddaSSatish Balay } 1806985db425SBarry Smith 1807985db425SBarry Smith #undef __FUNCT__ 1808985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 1809985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1810985db425SBarry Smith { 1811985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1812985db425SBarry Smith PetscErrorCode ierr; 1813d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1814985db425SBarry Smith PetscScalar *x; 1815985db425SBarry Smith MatScalar *aa = a->v; 1816985db425SBarry Smith 1817985db425SBarry Smith PetscFunctionBegin; 1818e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1819985db425SBarry Smith 1820985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1821985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1822985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1823e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1824985db425SBarry Smith for (i=0; i<m; i++) { 1825985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1826985db425SBarry Smith for (j=1; j<n; j++) { 1827985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1828985db425SBarry Smith } 1829985db425SBarry Smith } 1830985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1831985db425SBarry Smith PetscFunctionReturn(0); 1832985db425SBarry Smith } 1833985db425SBarry Smith 1834985db425SBarry Smith #undef __FUNCT__ 1835985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 1836985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 1837985db425SBarry Smith { 1838985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1839985db425SBarry Smith PetscErrorCode ierr; 1840d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1841985db425SBarry Smith PetscScalar *x; 1842985db425SBarry Smith PetscReal atmp; 1843985db425SBarry Smith MatScalar *aa = a->v; 1844985db425SBarry Smith 1845985db425SBarry Smith PetscFunctionBegin; 1846e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1847985db425SBarry Smith 1848985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1849985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1850985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1851e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1852985db425SBarry Smith for (i=0; i<m; i++) { 18539189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 1854985db425SBarry Smith for (j=1; j<n; j++) { 1855985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 1856985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 1857985db425SBarry Smith } 1858985db425SBarry Smith } 1859985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1860985db425SBarry Smith PetscFunctionReturn(0); 1861985db425SBarry Smith } 1862985db425SBarry Smith 1863985db425SBarry Smith #undef __FUNCT__ 1864985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 1865985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 1866985db425SBarry Smith { 1867985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1868985db425SBarry Smith PetscErrorCode ierr; 1869d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1870985db425SBarry Smith PetscScalar *x; 1871985db425SBarry Smith MatScalar *aa = a->v; 1872985db425SBarry Smith 1873985db425SBarry Smith PetscFunctionBegin; 1874e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1875985db425SBarry Smith 1876985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1877985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1878985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1879e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1880985db425SBarry Smith for (i=0; i<m; i++) { 1881985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1882985db425SBarry Smith for (j=1; j<n; j++) { 1883985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1884985db425SBarry Smith } 1885985db425SBarry Smith } 1886985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1887985db425SBarry Smith PetscFunctionReturn(0); 1888985db425SBarry Smith } 1889985db425SBarry Smith 18908d0534beSBarry Smith #undef __FUNCT__ 18918d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 18928d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 18938d0534beSBarry Smith { 18948d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 18958d0534beSBarry Smith PetscErrorCode ierr; 18968d0534beSBarry Smith PetscScalar *x; 18978d0534beSBarry Smith 18988d0534beSBarry Smith PetscFunctionBegin; 1899e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 19008d0534beSBarry Smith 19018d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1902d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 19038d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 19048d0534beSBarry Smith PetscFunctionReturn(0); 19058d0534beSBarry Smith } 19068d0534beSBarry Smith 19070716a85fSBarry Smith 19080716a85fSBarry Smith #undef __FUNCT__ 19090716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense" 19100716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 19110716a85fSBarry Smith { 19120716a85fSBarry Smith PetscErrorCode ierr; 19130716a85fSBarry Smith PetscInt i,j,m,n; 19140716a85fSBarry Smith PetscScalar *a; 19150716a85fSBarry Smith 19160716a85fSBarry Smith PetscFunctionBegin; 19170716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 19180716a85fSBarry Smith ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); 19198c778c55SBarry Smith ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr); 19200716a85fSBarry Smith if (type == NORM_2) { 19210716a85fSBarry Smith for (i=0; i<n; i++) { 19220716a85fSBarry Smith for (j=0; j<m; j++) { 19230716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 19240716a85fSBarry Smith } 19250716a85fSBarry Smith a += m; 19260716a85fSBarry Smith } 19270716a85fSBarry Smith } else if (type == NORM_1) { 19280716a85fSBarry Smith for (i=0; i<n; i++) { 19290716a85fSBarry Smith for (j=0; j<m; j++) { 19300716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 19310716a85fSBarry Smith } 19320716a85fSBarry Smith a += m; 19330716a85fSBarry Smith } 19340716a85fSBarry Smith } else if (type == NORM_INFINITY) { 19350716a85fSBarry Smith for (i=0; i<n; i++) { 19360716a85fSBarry Smith for (j=0; j<m; j++) { 19370716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 19380716a85fSBarry Smith } 19390716a85fSBarry Smith a += m; 19400716a85fSBarry Smith } 1941ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 19428c778c55SBarry Smith ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr); 19430716a85fSBarry Smith if (type == NORM_2) { 19448f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 19450716a85fSBarry Smith } 19460716a85fSBarry Smith PetscFunctionReturn(0); 19470716a85fSBarry Smith } 19480716a85fSBarry Smith 194973a71a0fSBarry Smith #undef __FUNCT__ 195073a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense" 195173a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 195273a71a0fSBarry Smith { 195373a71a0fSBarry Smith PetscErrorCode ierr; 195473a71a0fSBarry Smith PetscScalar *a; 195573a71a0fSBarry Smith PetscInt m,n,i; 195673a71a0fSBarry Smith 195773a71a0fSBarry Smith PetscFunctionBegin; 195873a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 19598c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 196073a71a0fSBarry Smith for (i=0; i<m*n; i++) { 196173a71a0fSBarry Smith ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr); 196273a71a0fSBarry Smith } 19638c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 196473a71a0fSBarry Smith PetscFunctionReturn(0); 196573a71a0fSBarry Smith } 196673a71a0fSBarry Smith 196773a71a0fSBarry Smith 1968289bc588SBarry Smith /* -------------------------------------------------------------------*/ 1969a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 1970905e6a2fSBarry Smith MatGetRow_SeqDense, 1971905e6a2fSBarry Smith MatRestoreRow_SeqDense, 1972905e6a2fSBarry Smith MatMult_SeqDense, 197397304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 19747c922b88SBarry Smith MatMultTranspose_SeqDense, 19757c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 1976db4efbfdSBarry Smith 0, 1977db4efbfdSBarry Smith 0, 1978db4efbfdSBarry Smith 0, 1979db4efbfdSBarry Smith /* 10*/ 0, 1980905e6a2fSBarry Smith MatLUFactor_SeqDense, 1981905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 198241f059aeSBarry Smith MatSOR_SeqDense, 1983ec8511deSBarry Smith MatTranspose_SeqDense, 198497304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 1985905e6a2fSBarry Smith MatEqual_SeqDense, 1986905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 1987905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 1988905e6a2fSBarry Smith MatNorm_SeqDense, 1989c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 1990c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 1991905e6a2fSBarry Smith MatSetOption_SeqDense, 1992905e6a2fSBarry Smith MatZeroEntries_SeqDense, 1993d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 1994db4efbfdSBarry Smith 0, 1995db4efbfdSBarry Smith 0, 1996db4efbfdSBarry Smith 0, 1997db4efbfdSBarry Smith 0, 19984994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 1999273d9f13SBarry Smith 0, 2000905e6a2fSBarry Smith 0, 200173a71a0fSBarry Smith 0, 200273a71a0fSBarry Smith 0, 2003d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2004a5ae1ecdSBarry Smith 0, 2005a5ae1ecdSBarry Smith 0, 2006a5ae1ecdSBarry Smith 0, 2007a5ae1ecdSBarry Smith 0, 2008d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 2009a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 2010a5ae1ecdSBarry Smith 0, 20114b0e389bSBarry Smith MatGetValues_SeqDense, 2012a5ae1ecdSBarry Smith MatCopy_SeqDense, 2013d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2014a5ae1ecdSBarry Smith MatScale_SeqDense, 2015a5ae1ecdSBarry Smith 0, 2016a5ae1ecdSBarry Smith 0, 2017a5ae1ecdSBarry Smith 0, 201873a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2019a5ae1ecdSBarry Smith 0, 2020a5ae1ecdSBarry Smith 0, 2021a5ae1ecdSBarry Smith 0, 2022a5ae1ecdSBarry Smith 0, 2023d519adbfSMatthew Knepley /* 54*/ 0, 2024a5ae1ecdSBarry Smith 0, 2025a5ae1ecdSBarry Smith 0, 2026a5ae1ecdSBarry Smith 0, 2027a5ae1ecdSBarry Smith 0, 2028d519adbfSMatthew Knepley /* 59*/ 0, 2029e03a110bSBarry Smith MatDestroy_SeqDense, 2030e03a110bSBarry Smith MatView_SeqDense, 2031357abbc8SBarry Smith 0, 203297304618SKris Buschelman 0, 2033d519adbfSMatthew Knepley /* 64*/ 0, 203497304618SKris Buschelman 0, 203597304618SKris Buschelman 0, 203697304618SKris Buschelman 0, 203797304618SKris Buschelman 0, 2038d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 203997304618SKris Buschelman 0, 204097304618SKris Buschelman 0, 204197304618SKris Buschelman 0, 204297304618SKris Buschelman 0, 2043d519adbfSMatthew Knepley /* 74*/ 0, 204497304618SKris Buschelman 0, 204597304618SKris Buschelman 0, 204697304618SKris Buschelman 0, 204797304618SKris Buschelman 0, 2048d519adbfSMatthew Knepley /* 79*/ 0, 204997304618SKris Buschelman 0, 205097304618SKris Buschelman 0, 205197304618SKris Buschelman 0, 20525bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2053865e5f61SKris Buschelman 0, 20541cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2055865e5f61SKris Buschelman 0, 2056865e5f61SKris Buschelman 0, 2057865e5f61SKris Buschelman 0, 2058d519adbfSMatthew Knepley /* 89*/ MatMatMult_SeqDense_SeqDense, 2059a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 2060a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2061865e5f61SKris Buschelman 0, 2062865e5f61SKris Buschelman 0, 2063d519adbfSMatthew Knepley /* 94*/ 0, 20645df89d91SHong Zhang 0, 20655df89d91SHong Zhang 0, 20665df89d91SHong Zhang 0, 2067284134d9SBarry Smith 0, 2068d519adbfSMatthew Knepley /* 99*/ 0, 2069284134d9SBarry Smith 0, 2070284134d9SBarry Smith 0, 2071ba337c44SJed Brown MatConjugate_SeqDense, 2072f73d5cc4SBarry Smith 0, 2073ba337c44SJed Brown /*104*/ 0, 2074ba337c44SJed Brown MatRealPart_SeqDense, 2075ba337c44SJed Brown MatImaginaryPart_SeqDense, 2076985db425SBarry Smith 0, 2077985db425SBarry Smith 0, 207885e2c93fSHong Zhang /*109*/ MatMatSolve_SeqDense, 2079985db425SBarry Smith 0, 20808d0534beSBarry Smith MatGetRowMin_SeqDense, 2081aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 2082aabbc4fbSShri Abhyankar 0, 2083aabbc4fbSShri Abhyankar /*114*/ 0, 2084aabbc4fbSShri Abhyankar 0, 2085aabbc4fbSShri Abhyankar 0, 2086aabbc4fbSShri Abhyankar 0, 2087aabbc4fbSShri Abhyankar 0, 2088aabbc4fbSShri Abhyankar /*119*/ 0, 2089aabbc4fbSShri Abhyankar 0, 2090aabbc4fbSShri Abhyankar 0, 20910716a85fSBarry Smith 0, 20920716a85fSBarry Smith 0, 20930716a85fSBarry Smith /*124*/ 0, 20945df89d91SHong Zhang MatGetColumnNorms_SeqDense, 20955df89d91SHong Zhang 0, 20965df89d91SHong Zhang 0, 20975df89d91SHong Zhang 0, 20985df89d91SHong Zhang /*129*/ 0, 209975648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 210075648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 210175648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 21023964eb88SJed Brown 0, 21033964eb88SJed Brown /*134*/ 0, 21043964eb88SJed Brown 0, 21053964eb88SJed Brown 0, 21063964eb88SJed Brown 0, 21073964eb88SJed Brown 0, 21083964eb88SJed Brown /*139*/ 0, 2109f9426fe0SMark Adams 0, 21103964eb88SJed Brown 0 2111985db425SBarry Smith }; 211290ace30eSBarry Smith 21134a2ae208SSatish Balay #undef __FUNCT__ 21144a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 21154b828684SBarry Smith /*@C 2116fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2117d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2118d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2119289bc588SBarry Smith 2120db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2121db81eaa0SLois Curfman McInnes 212220563c6bSBarry Smith Input Parameters: 2123db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 21240c775827SLois Curfman McInnes . m - number of rows 212518f449edSLois Curfman McInnes . n - number of columns 21260298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2127dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 212820563c6bSBarry Smith 212920563c6bSBarry Smith Output Parameter: 213044cd7ae7SLois Curfman McInnes . A - the matrix 213120563c6bSBarry Smith 2132b259b22eSLois Curfman McInnes Notes: 213318f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 213418f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 21350298fd71SBarry Smith set data=NULL. 213618f449edSLois Curfman McInnes 2137027ccd11SLois Curfman McInnes Level: intermediate 2138027ccd11SLois Curfman McInnes 2139dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 2140d65003e9SLois Curfman McInnes 214169b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 214220563c6bSBarry Smith @*/ 21437087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2144289bc588SBarry Smith { 2145dfbe8321SBarry Smith PetscErrorCode ierr; 21463b2fbd54SBarry Smith 21473a40ed3dSBarry Smith PetscFunctionBegin; 2148f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2149f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2150273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2151273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2152273d9f13SBarry Smith PetscFunctionReturn(0); 2153273d9f13SBarry Smith } 2154273d9f13SBarry Smith 21554a2ae208SSatish Balay #undef __FUNCT__ 2156afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 2157273d9f13SBarry Smith /*@C 2158273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2159273d9f13SBarry Smith 2160273d9f13SBarry Smith Collective on MPI_Comm 2161273d9f13SBarry Smith 2162273d9f13SBarry Smith Input Parameters: 21631c4f3114SJed Brown + B - the matrix 21640298fd71SBarry Smith - data - the array (or NULL) 2165273d9f13SBarry Smith 2166273d9f13SBarry Smith Notes: 2167273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2168273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2169284134d9SBarry Smith need not call this routine. 2170273d9f13SBarry Smith 2171273d9f13SBarry Smith Level: intermediate 2172273d9f13SBarry Smith 2173273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2174273d9f13SBarry Smith 217569b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2176867c911aSBarry Smith 2177273d9f13SBarry Smith @*/ 21787087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2179273d9f13SBarry Smith { 21804ac538c5SBarry Smith PetscErrorCode ierr; 2181a23d5eceSKris Buschelman 2182a23d5eceSKris Buschelman PetscFunctionBegin; 21834ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2184a23d5eceSKris Buschelman PetscFunctionReturn(0); 2185a23d5eceSKris Buschelman } 2186a23d5eceSKris Buschelman 2187a23d5eceSKris Buschelman #undef __FUNCT__ 2188afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 21897087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2190a23d5eceSKris Buschelman { 2191273d9f13SBarry Smith Mat_SeqDense *b; 2192dfbe8321SBarry Smith PetscErrorCode ierr; 2193273d9f13SBarry Smith 2194273d9f13SBarry Smith PetscFunctionBegin; 2195273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2196a868139aSShri Abhyankar 219734ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 219834ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 219934ef9618SShri Abhyankar 2200273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 220186d161a7SShri Abhyankar b->Mmax = B->rmap->n; 220286d161a7SShri Abhyankar b->Nmax = B->cmap->n; 220386d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 220486d161a7SShri Abhyankar 22059e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 22069e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2207e92229d0SSatish Balay ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr); 22083bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 22092205254eSKarl Rupp 22109e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2211273d9f13SBarry Smith } else { /* user-allocated storage */ 22129e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2213273d9f13SBarry Smith b->v = data; 2214273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2215273d9f13SBarry Smith } 22160450473dSBarry Smith B->assembled = PETSC_TRUE; 2217273d9f13SBarry Smith PetscFunctionReturn(0); 2218273d9f13SBarry Smith } 2219273d9f13SBarry Smith 22201b807ce4Svictorle #undef __FUNCT__ 22218baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental" 22228baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 22238baccfbdSHong Zhang { 22248baccfbdSHong Zhang PetscFunctionBegin; 22258baccfbdSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No support for requested operation"); 22268baccfbdSHong Zhang PetscFunctionReturn(0); 22278baccfbdSHong Zhang } 22288baccfbdSHong Zhang 22298baccfbdSHong Zhang #undef __FUNCT__ 22301b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 22311b807ce4Svictorle /*@C 22321b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 22331b807ce4Svictorle 22341b807ce4Svictorle Input parameter: 22351b807ce4Svictorle + A - the matrix 22361b807ce4Svictorle - lda - the leading dimension 22371b807ce4Svictorle 22381b807ce4Svictorle Notes: 2239867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 22401b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 22411b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 22421b807ce4Svictorle 22431b807ce4Svictorle Level: intermediate 22441b807ce4Svictorle 22451b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 22461b807ce4Svictorle 2247284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2248867c911aSBarry Smith 22491b807ce4Svictorle @*/ 22507087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 22511b807ce4Svictorle { 22521b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 225321a2c019SBarry Smith 22541b807ce4Svictorle PetscFunctionBegin; 2255e32f2f54SBarry 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); 22561b807ce4Svictorle b->lda = lda; 225721a2c019SBarry Smith b->changelda = PETSC_FALSE; 225821a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 22591b807ce4Svictorle PetscFunctionReturn(0); 22601b807ce4Svictorle } 22611b807ce4Svictorle 22620bad9183SKris Buschelman /*MC 2263fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 22640bad9183SKris Buschelman 22650bad9183SKris Buschelman Options Database Keys: 22660bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 22670bad9183SKris Buschelman 22680bad9183SKris Buschelman Level: beginner 22690bad9183SKris Buschelman 227089665df3SBarry Smith .seealso: MatCreateSeqDense() 227189665df3SBarry Smith 22720bad9183SKris Buschelman M*/ 22730bad9183SKris Buschelman 22744a2ae208SSatish Balay #undef __FUNCT__ 22754a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 22768cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B) 2277273d9f13SBarry Smith { 2278273d9f13SBarry Smith Mat_SeqDense *b; 2279dfbe8321SBarry Smith PetscErrorCode ierr; 22807c334f02SBarry Smith PetscMPIInt size; 2281273d9f13SBarry Smith 2282273d9f13SBarry Smith PetscFunctionBegin; 2283ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 2284e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 228555659b69SBarry Smith 2286b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 2287549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 228844cd7ae7SLois Curfman McInnes B->data = (void*)b; 228918f449edSLois Curfman McInnes 229044cd7ae7SLois Curfman McInnes b->pivots = 0; 2291273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2292273d9f13SBarry Smith b->v = 0; 229321a2c019SBarry Smith b->changelda = PETSC_FALSE; 22944e220ebcSLois Curfman McInnes 2295bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 2296bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2297bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 22988baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 22998baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 23008baccfbdSHong Zhang #endif 2301bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatGetFactor_petsc_C",MatGetFactor_seqdense_petsc);CHKERRQ(ierr); 2302bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 2303bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2304bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2305bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 23063bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 23073bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 23083bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 230917667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 23103a40ed3dSBarry Smith PetscFunctionReturn(0); 2311289bc588SBarry Smith } 2312