1be1d678aSKris Buschelman #define PETSCMAT_DLL 2be1d678aSKris Buschelman 367e560aaSBarry Smith /* 467e560aaSBarry Smith Defines the basic matrix operations for sequential dense. 567e560aaSBarry Smith */ 6289bc588SBarry Smith 770f55243SBarry Smith #include "src/mat/impls/dense/seq/dense.h" 8b4c862e0SSatish Balay #include "petscblaslapack.h" 9289bc588SBarry Smith 104a2ae208SSatish Balay #undef __FUNCT__ 114a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense" 12f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 131987afe7SBarry Smith { 141987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 15f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 1613f74950SBarry Smith PetscInt j; 170805154bSBarry Smith PetscBLASInt N,m,ldax,lday,one = 1; 18efee365bSSatish Balay PetscErrorCode ierr; 193a40ed3dSBarry Smith 203a40ed3dSBarry Smith PetscFunctionBegin; 21d0f46423SBarry Smith N = PetscBLASIntCast(X->rmap->n*X->cmap->n); 22d0f46423SBarry Smith m = PetscBLASIntCast(X->rmap->n); 230805154bSBarry Smith ldax = PetscBLASIntCast(x->lda); 240805154bSBarry Smith lday = PetscBLASIntCast(y->lda); 25a5ce6ee0Svictorle if (ldax>m || lday>m) { 26d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 27f4df32b1SMatthew Knepley BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one); 28a5ce6ee0Svictorle } 29a5ce6ee0Svictorle } else { 30f4df32b1SMatthew Knepley BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one); 31a5ce6ee0Svictorle } 32efee365bSSatish Balay ierr = PetscLogFlops(2*N-1);CHKERRQ(ierr); 333a40ed3dSBarry Smith PetscFunctionReturn(0); 341987afe7SBarry Smith } 351987afe7SBarry Smith 364a2ae208SSatish Balay #undef __FUNCT__ 374a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense" 38dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 39289bc588SBarry Smith { 40d0f46423SBarry Smith PetscInt N = A->rmap->n*A->cmap->n; 413a40ed3dSBarry Smith 423a40ed3dSBarry Smith PetscFunctionBegin; 43d0f46423SBarry Smith info->rows_global = (double)A->rmap->n; 44d0f46423SBarry Smith info->columns_global = (double)A->cmap->n; 45d0f46423SBarry Smith info->rows_local = (double)A->rmap->n; 46d0f46423SBarry Smith info->columns_local = (double)A->cmap->n; 474e220ebcSLois Curfman McInnes info->block_size = 1.0; 484e220ebcSLois Curfman McInnes info->nz_allocated = (double)N; 496de62eeeSBarry Smith info->nz_used = (double)N; 506de62eeeSBarry Smith info->nz_unneeded = (double)0; 514e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 524e220ebcSLois Curfman McInnes info->mallocs = 0; 537adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 544e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 554e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 564e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 573a40ed3dSBarry Smith PetscFunctionReturn(0); 58289bc588SBarry Smith } 59289bc588SBarry Smith 604a2ae208SSatish Balay #undef __FUNCT__ 614a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense" 62f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 6380cd9d93SLois Curfman McInnes { 64273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 65f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 66efee365bSSatish Balay PetscErrorCode ierr; 670805154bSBarry Smith PetscBLASInt one = 1,j,nz,lda = PetscBLASIntCast(a->lda); 6880cd9d93SLois Curfman McInnes 693a40ed3dSBarry Smith PetscFunctionBegin; 70d0f46423SBarry Smith if (lda>A->rmap->n) { 71d0f46423SBarry Smith nz = PetscBLASIntCast(A->rmap->n); 72d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 73f4df32b1SMatthew Knepley BLASscal_(&nz,&oalpha,a->v+j*lda,&one); 74a5ce6ee0Svictorle } 75a5ce6ee0Svictorle } else { 76d0f46423SBarry Smith nz = PetscBLASIntCast(A->rmap->n*A->cmap->n); 77f4df32b1SMatthew Knepley BLASscal_(&nz,&oalpha,a->v,&one); 78a5ce6ee0Svictorle } 79efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 803a40ed3dSBarry Smith PetscFunctionReturn(0); 8180cd9d93SLois Curfman McInnes } 8280cd9d93SLois Curfman McInnes 831cbb95d3SBarry Smith #undef __FUNCT__ 841cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense" 851cbb95d3SBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscTruth *fl) 861cbb95d3SBarry Smith { 871cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 88d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,N; 891cbb95d3SBarry Smith PetscScalar *v = a->v; 901cbb95d3SBarry Smith 911cbb95d3SBarry Smith PetscFunctionBegin; 921cbb95d3SBarry Smith *fl = PETSC_FALSE; 93d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 941cbb95d3SBarry Smith N = a->lda; 951cbb95d3SBarry Smith 961cbb95d3SBarry Smith for (i=0; i<m; i++) { 971cbb95d3SBarry Smith for (j=i+1; j<m; j++) { 981cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 991cbb95d3SBarry Smith } 1001cbb95d3SBarry Smith } 1011cbb95d3SBarry Smith *fl = PETSC_TRUE; 1021cbb95d3SBarry Smith PetscFunctionReturn(0); 1031cbb95d3SBarry Smith } 1041cbb95d3SBarry Smith 1056ee01492SSatish Balay 106b24902e0SBarry Smith 107b24902e0SBarry Smith #undef __FUNCT__ 108b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense" 109b24902e0SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 110b24902e0SBarry Smith { 111b24902e0SBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 112b24902e0SBarry Smith PetscErrorCode ierr; 113b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 114b24902e0SBarry Smith Mat newi = *newmat; 115b24902e0SBarry Smith 116b24902e0SBarry Smith PetscFunctionBegin; 1175c9eb25fSBarry Smith ierr = MatSeqDenseSetPreallocation(*newmat,PETSC_NULL);CHKERRQ(ierr); 118b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 119b24902e0SBarry Smith l = (Mat_SeqDense*)newi->data; 120d0f46423SBarry Smith if (lda>A->rmap->n) { 121d0f46423SBarry Smith m = A->rmap->n; 122d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 123b24902e0SBarry Smith ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 124b24902e0SBarry Smith } 125b24902e0SBarry Smith } else { 126d0f46423SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 127b24902e0SBarry Smith } 128b24902e0SBarry Smith } 129b24902e0SBarry Smith newi->assembled = PETSC_TRUE; 130b24902e0SBarry Smith PetscFunctionReturn(0); 131b24902e0SBarry Smith } 132b24902e0SBarry Smith 1334a2ae208SSatish Balay #undef __FUNCT__ 1344a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense" 135dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 13602cad45dSBarry Smith { 1376849ba73SBarry Smith PetscErrorCode ierr; 13802cad45dSBarry Smith 1393a40ed3dSBarry Smith PetscFunctionBegin; 1405c9eb25fSBarry Smith ierr = MatCreate(((PetscObject)A)->comm,newmat);CHKERRQ(ierr); 141d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1425c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 143b24902e0SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(A,cpvalues,newmat);CHKERRQ(ierr); 144b24902e0SBarry Smith PetscFunctionReturn(0); 145b24902e0SBarry Smith } 146b24902e0SBarry Smith 1476ee01492SSatish Balay 1484a2ae208SSatish Balay #undef __FUNCT__ 1494a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense" 150af281ebdSHong Zhang PetscErrorCode MatLUFactorNumeric_SeqDense(Mat A,MatFactorInfo *info_dummy,Mat *fact) 151289bc588SBarry Smith { 15202cad45dSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l = (Mat_SeqDense*)(*fact)->data; 1536849ba73SBarry Smith PetscErrorCode ierr; 154d0f46423SBarry Smith PetscInt lda1=mat->lda,lda2=l->lda, m=A->rmap->n,n=A->cmap->n, j; 1554482741eSBarry Smith MatFactorInfo info; 1563a40ed3dSBarry Smith 1573a40ed3dSBarry Smith PetscFunctionBegin; 15802cad45dSBarry Smith /* copy the numerical values */ 1591b807ce4Svictorle if (lda1>m || lda2>m ) { 1601b807ce4Svictorle for (j=0; j<n; j++) { 1611b807ce4Svictorle ierr = PetscMemcpy(l->v+j*lda2,mat->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1621b807ce4Svictorle } 1631b807ce4Svictorle } else { 164d0f46423SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1651b807ce4Svictorle } 1669f4db6b0SBarry Smith (*fact)->factor = MAT_FACTOR_NONE; 1674482741eSBarry Smith ierr = MatLUFactor(*fact,0,0,&info);CHKERRQ(ierr); 1683a40ed3dSBarry Smith PetscFunctionReturn(0); 169289bc588SBarry Smith } 1706ee01492SSatish Balay 1710b4b3355SBarry Smith 1720b4b3355SBarry Smith #undef __FUNCT__ 1734a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense" 174dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 175289bc588SBarry Smith { 176c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1776849ba73SBarry Smith PetscErrorCode ierr; 17887828ca2SBarry Smith PetscScalar *x,*y; 179d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 18067e560aaSBarry Smith 1813a40ed3dSBarry Smith PetscFunctionBegin; 1821ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 1831ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 184d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1855c9eb25fSBarry Smith if (A->factor == MAT_FACTOR_LU) { 186ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 18780444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 188ae7cfcebSSatish Balay #else 18971044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 1904ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"GETRS - Bad solve"); 191ae7cfcebSSatish Balay #endif 1925c9eb25fSBarry Smith } else if (A->factor == MAT_FACTOR_CHOLESKY){ 193ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 19480444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 195ae7cfcebSSatish Balay #else 19671044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 1974ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS Bad solve"); 198ae7cfcebSSatish Balay #endif 199289bc588SBarry Smith } 20029bbc08cSBarry Smith else SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 2011ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2021ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 203d0f46423SBarry Smith ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 2043a40ed3dSBarry Smith PetscFunctionReturn(0); 205289bc588SBarry Smith } 2066ee01492SSatish Balay 2074a2ae208SSatish Balay #undef __FUNCT__ 2084a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense" 209dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 210da3a660dSBarry Smith { 211c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 212dfbe8321SBarry Smith PetscErrorCode ierr; 21387828ca2SBarry Smith PetscScalar *x,*y; 214d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 21567e560aaSBarry Smith 2163a40ed3dSBarry Smith PetscFunctionBegin; 2171ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2181ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 219d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 220752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 221da3a660dSBarry Smith if (mat->pivots) { 222ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 22380444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 224ae7cfcebSSatish Balay #else 22571044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 2264ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS - Bad solve"); 227ae7cfcebSSatish Balay #endif 2287a97a34bSBarry Smith } else { 229ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 23080444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 231ae7cfcebSSatish Balay #else 23271044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 2334ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS - Bad solve"); 234ae7cfcebSSatish Balay #endif 235da3a660dSBarry Smith } 2361ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2371ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 238d0f46423SBarry Smith ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 2393a40ed3dSBarry Smith PetscFunctionReturn(0); 240da3a660dSBarry Smith } 2416ee01492SSatish Balay 2424a2ae208SSatish Balay #undef __FUNCT__ 2434a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense" 244dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 245da3a660dSBarry Smith { 246c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 247dfbe8321SBarry Smith PetscErrorCode ierr; 24887828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 249da3a660dSBarry Smith Vec tmp = 0; 250d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 25167e560aaSBarry Smith 2523a40ed3dSBarry Smith PetscFunctionBegin; 2531ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2541ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 255d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 256da3a660dSBarry Smith if (yy == zz) { 25778b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 25852e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 25978b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 260da3a660dSBarry Smith } 261d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 262752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 263da3a660dSBarry Smith if (mat->pivots) { 264ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 26580444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 266ae7cfcebSSatish Balay #else 26771044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 2682ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 269ae7cfcebSSatish Balay #endif 270a8c6a408SBarry Smith } else { 271ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 27280444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 273ae7cfcebSSatish Balay #else 27471044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 2752ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 276ae7cfcebSSatish Balay #endif 277da3a660dSBarry Smith } 2782dcb1b2aSMatthew Knepley if (tmp) {ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); ierr = VecDestroy(tmp);CHKERRQ(ierr);} 2792dcb1b2aSMatthew Knepley else {ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);} 2801ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2811ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 282d0f46423SBarry Smith ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 2833a40ed3dSBarry Smith PetscFunctionReturn(0); 284da3a660dSBarry Smith } 28567e560aaSBarry Smith 2864a2ae208SSatish Balay #undef __FUNCT__ 2874a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense" 288dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 289da3a660dSBarry Smith { 290c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 2916849ba73SBarry Smith PetscErrorCode ierr; 29287828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 293da3a660dSBarry Smith Vec tmp; 294d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 29567e560aaSBarry Smith 2963a40ed3dSBarry Smith PetscFunctionBegin; 297d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 2981ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2991ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 300da3a660dSBarry Smith if (yy == zz) { 30178b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 30252e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 30378b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 304da3a660dSBarry Smith } 305d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 306752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 307da3a660dSBarry Smith if (mat->pivots) { 308ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 30980444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 310ae7cfcebSSatish Balay #else 31171044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 3122ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 313ae7cfcebSSatish Balay #endif 3143a40ed3dSBarry Smith } else { 315ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 31680444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 317ae7cfcebSSatish Balay #else 31871044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 3192ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 320ae7cfcebSSatish Balay #endif 321da3a660dSBarry Smith } 32290f02eecSBarry Smith if (tmp) { 3232dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 32490f02eecSBarry Smith ierr = VecDestroy(tmp);CHKERRQ(ierr); 3253a40ed3dSBarry Smith } else { 3262dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 32790f02eecSBarry Smith } 3281ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3291ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 330d0f46423SBarry Smith ierr = PetscLogFlops(2*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 3313a40ed3dSBarry Smith PetscFunctionReturn(0); 332da3a660dSBarry Smith } 333*db4efbfdSBarry Smith 334*db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 335*db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 336*db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 337*db4efbfdSBarry Smith #undef __FUNCT__ 338*db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense" 339*db4efbfdSBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,MatFactorInfo *minfo) 340*db4efbfdSBarry Smith { 341*db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 342*db4efbfdSBarry Smith PetscFunctionBegin; 343*db4efbfdSBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 344*db4efbfdSBarry Smith #else 345*db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 346*db4efbfdSBarry Smith PetscErrorCode ierr; 347*db4efbfdSBarry Smith PetscBLASInt n,m,info; 348*db4efbfdSBarry Smith 349*db4efbfdSBarry Smith PetscFunctionBegin; 350*db4efbfdSBarry Smith n = PetscBLASIntCast(A->cmap->n); 351*db4efbfdSBarry Smith m = PetscBLASIntCast(A->rmap->n); 352*db4efbfdSBarry Smith if (!mat->pivots) { 353*db4efbfdSBarry Smith ierr = PetscMalloc((A->rmap->n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr); 354*db4efbfdSBarry Smith ierr = PetscLogObjectMemory(A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 355*db4efbfdSBarry Smith } 356*db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 357*db4efbfdSBarry Smith LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info); 358*db4efbfdSBarry Smith if (info<0) SETERRQ(PETSC_ERR_LIB,"Bad argument to LU factorization"); 359*db4efbfdSBarry Smith if (info>0) SETERRQ(PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 360*db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 361*db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 362*db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 363*db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 364*db4efbfdSBarry Smith A->factor = MAT_FACTOR_LU; 365*db4efbfdSBarry Smith 366*db4efbfdSBarry Smith ierr = PetscLogFlops((2*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 367*db4efbfdSBarry Smith #endif 368*db4efbfdSBarry Smith PetscFunctionReturn(0); 369*db4efbfdSBarry Smith } 370*db4efbfdSBarry Smith 371*db4efbfdSBarry Smith #undef __FUNCT__ 372*db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense" 373*db4efbfdSBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,MatFactorInfo *factinfo) 374*db4efbfdSBarry Smith { 375*db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 376*db4efbfdSBarry Smith PetscFunctionBegin; 377*db4efbfdSBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 378*db4efbfdSBarry Smith #else 379*db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 380*db4efbfdSBarry Smith PetscErrorCode ierr; 381*db4efbfdSBarry Smith PetscBLASInt info,n = PetscBLASIntCast(A->cmap->n); 382*db4efbfdSBarry Smith 383*db4efbfdSBarry Smith PetscFunctionBegin; 384*db4efbfdSBarry Smith ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 385*db4efbfdSBarry Smith mat->pivots = 0; 386*db4efbfdSBarry Smith 387*db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 388*db4efbfdSBarry Smith LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info); 389*db4efbfdSBarry Smith if (info) SETERRQ1(PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 390*db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 391*db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 392*db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 393*db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 394*db4efbfdSBarry Smith A->factor = MAT_FACTOR_CHOLESKY; 395*db4efbfdSBarry Smith ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 396*db4efbfdSBarry Smith #endif 397*db4efbfdSBarry Smith PetscFunctionReturn(0); 398*db4efbfdSBarry Smith } 399*db4efbfdSBarry Smith 400*db4efbfdSBarry Smith 401*db4efbfdSBarry Smith #undef __FUNCT__ 402*db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense" 403*db4efbfdSBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat A,MatFactorInfo *info_dummy,Mat *fact) 404*db4efbfdSBarry Smith { 405*db4efbfdSBarry Smith PetscErrorCode ierr; 406*db4efbfdSBarry Smith MatFactorInfo info; 407*db4efbfdSBarry Smith 408*db4efbfdSBarry Smith PetscFunctionBegin; 409*db4efbfdSBarry Smith info.fill = 1.0; 410*db4efbfdSBarry Smith ierr = MatCholeskyFactor_SeqDense(*fact,0,&info);CHKERRQ(ierr); 411*db4efbfdSBarry Smith PetscFunctionReturn(0); 412*db4efbfdSBarry Smith } 413*db4efbfdSBarry Smith 414*db4efbfdSBarry Smith #undef __FUNCT__ 415*db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense" 416*db4efbfdSBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat A,IS row,MatFactorInfo *info,Mat *fact) 417*db4efbfdSBarry Smith { 418*db4efbfdSBarry Smith PetscErrorCode ierr; 419*db4efbfdSBarry Smith 420*db4efbfdSBarry Smith PetscFunctionBegin; 421*db4efbfdSBarry Smith ierr = MatDuplicateNoCreate_SeqDense(A,MAT_COPY_VALUES,fact);CHKERRQ(ierr); 422*db4efbfdSBarry Smith (*fact)->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 423*db4efbfdSBarry Smith (*fact)->ops->solve = MatSolve_SeqDense; 424*db4efbfdSBarry Smith (*fact)->ops->solvetranspose = MatSolveTranspose_SeqDense; 425*db4efbfdSBarry Smith (*fact)->ops->solveadd = MatSolveAdd_SeqDense; 426*db4efbfdSBarry Smith (*fact)->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 427*db4efbfdSBarry Smith PetscFunctionReturn(0); 428*db4efbfdSBarry Smith } 429*db4efbfdSBarry Smith 430*db4efbfdSBarry Smith #undef __FUNCT__ 431*db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense" 432*db4efbfdSBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat A,IS row,IS col,MatFactorInfo *info,Mat *fact) 433*db4efbfdSBarry Smith { 434*db4efbfdSBarry Smith PetscErrorCode ierr; 435*db4efbfdSBarry Smith 436*db4efbfdSBarry Smith PetscFunctionBegin; 437*db4efbfdSBarry Smith ierr = MatDuplicateNoCreate_SeqDense(A,MAT_DO_NOT_COPY_VALUES,fact);CHKERRQ(ierr); 438*db4efbfdSBarry Smith (*fact)->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 439*db4efbfdSBarry Smith (*fact)->ops->solve = MatSolve_SeqDense; 440*db4efbfdSBarry Smith (*fact)->ops->solvetranspose = MatSolveTranspose_SeqDense; 441*db4efbfdSBarry Smith (*fact)->ops->solveadd = MatSolveAdd_SeqDense; 442*db4efbfdSBarry Smith (*fact)->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 443*db4efbfdSBarry Smith PetscFunctionReturn(0); 444*db4efbfdSBarry Smith } 445*db4efbfdSBarry Smith 446*db4efbfdSBarry Smith #undef __FUNCT__ 447*db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc" 448*db4efbfdSBarry Smith PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 449*db4efbfdSBarry Smith { 450*db4efbfdSBarry Smith PetscErrorCode ierr; 451*db4efbfdSBarry Smith 452*db4efbfdSBarry Smith PetscFunctionBegin; 453*db4efbfdSBarry Smith ierr = MatCreate(((PetscObject)A)->comm,fact);CHKERRQ(ierr); 454*db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 455*db4efbfdSBarry Smith ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr); 456*db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU){ 457*db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 458*db4efbfdSBarry Smith } else { 459*db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 460*db4efbfdSBarry Smith } 461*db4efbfdSBarry Smith (*fact)->factor = ftype; 462*db4efbfdSBarry Smith PetscFunctionReturn(0); 463*db4efbfdSBarry Smith } 464*db4efbfdSBarry Smith 465289bc588SBarry Smith /* ------------------------------------------------------------------*/ 4664a2ae208SSatish Balay #undef __FUNCT__ 4674a2ae208SSatish Balay #define __FUNCT__ "MatRelax_SeqDense" 46813f74950SBarry Smith PetscErrorCode MatRelax_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 469289bc588SBarry Smith { 470c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 47187828ca2SBarry Smith PetscScalar *x,*b,*v = mat->v,zero = 0.0,xt; 472dfbe8321SBarry Smith PetscErrorCode ierr; 473d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 474aa482453SBarry Smith #if !defined(PETSC_USE_COMPLEX) 4750805154bSBarry Smith PetscBLASInt o = 1,bm = PetscBLASIntCast(m); 476bc1b551cSSatish Balay #endif 477289bc588SBarry Smith 4783a40ed3dSBarry Smith PetscFunctionBegin; 479289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 48071044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 4812dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 482289bc588SBarry Smith } 4831ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 4841ebc52fbSHong Zhang ierr = VecGetArray(bb,&b);CHKERRQ(ierr); 485b965ef7fSBarry Smith its = its*lits; 48677431f27SBarry Smith if (its <= 0) SETERRQ2(PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits); 487289bc588SBarry Smith while (its--) { 488fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){ 489289bc588SBarry Smith for (i=0; i<m; i++) { 490aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 491f1747703SBarry Smith /* cannot use BLAS dot for complex because compiler/linker is 492f1747703SBarry Smith not happy about returning a double complex */ 49313f74950SBarry Smith PetscInt _i; 49487828ca2SBarry Smith PetscScalar sum = b[i]; 495f1747703SBarry Smith for (_i=0; _i<m; _i++) { 4963f6de6efSSatish Balay sum -= PetscConj(v[i+_i*m])*x[_i]; 497f1747703SBarry Smith } 498f1747703SBarry Smith xt = sum; 499f1747703SBarry Smith #else 50071044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 501f1747703SBarry Smith #endif 50255a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 503289bc588SBarry Smith } 504289bc588SBarry Smith } 505fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){ 506289bc588SBarry Smith for (i=m-1; i>=0; i--) { 507aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 508f1747703SBarry Smith /* cannot use BLAS dot for complex because compiler/linker is 509f1747703SBarry Smith not happy about returning a double complex */ 51013f74950SBarry Smith PetscInt _i; 51187828ca2SBarry Smith PetscScalar sum = b[i]; 512f1747703SBarry Smith for (_i=0; _i<m; _i++) { 5133f6de6efSSatish Balay sum -= PetscConj(v[i+_i*m])*x[_i]; 514f1747703SBarry Smith } 515f1747703SBarry Smith xt = sum; 516f1747703SBarry Smith #else 51771044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 518f1747703SBarry Smith #endif 51955a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 520289bc588SBarry Smith } 521289bc588SBarry Smith } 522289bc588SBarry Smith } 5231ebc52fbSHong Zhang ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr); 5241ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5253a40ed3dSBarry Smith PetscFunctionReturn(0); 526289bc588SBarry Smith } 527289bc588SBarry Smith 528289bc588SBarry Smith /* -----------------------------------------------------------------*/ 5294a2ae208SSatish Balay #undef __FUNCT__ 5304a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense" 531dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 532289bc588SBarry Smith { 533c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 53487828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 535dfbe8321SBarry Smith PetscErrorCode ierr; 5360805154bSBarry Smith PetscBLASInt m, n,_One=1; 537ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 5383a40ed3dSBarry Smith 5393a40ed3dSBarry Smith PetscFunctionBegin; 540d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 541d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 542d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5431ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5441ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 54571044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One); 5461ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5471ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 548d0f46423SBarry Smith ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 5493a40ed3dSBarry Smith PetscFunctionReturn(0); 550289bc588SBarry Smith } 5516ee01492SSatish Balay 5524a2ae208SSatish Balay #undef __FUNCT__ 5534a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense" 554dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 555289bc588SBarry Smith { 556c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 55787828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0; 558dfbe8321SBarry Smith PetscErrorCode ierr; 5590805154bSBarry Smith PetscBLASInt m, n, _One=1; 5603a40ed3dSBarry Smith 5613a40ed3dSBarry Smith PetscFunctionBegin; 562d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 563d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 564d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5651ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5661ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 56771044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One); 5681ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5691ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 570d0f46423SBarry Smith ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 5713a40ed3dSBarry Smith PetscFunctionReturn(0); 572289bc588SBarry Smith } 5736ee01492SSatish Balay 5744a2ae208SSatish Balay #undef __FUNCT__ 5754a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense" 576dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 577289bc588SBarry Smith { 578c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 57987828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0; 580dfbe8321SBarry Smith PetscErrorCode ierr; 5810805154bSBarry Smith PetscBLASInt m, n, _One=1; 5823a40ed3dSBarry Smith 5833a40ed3dSBarry Smith PetscFunctionBegin; 584d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 585d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 586d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 587600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 5881ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5891ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 59071044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 5911ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5921ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 593d0f46423SBarry Smith ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 5943a40ed3dSBarry Smith PetscFunctionReturn(0); 595289bc588SBarry Smith } 5966ee01492SSatish Balay 5974a2ae208SSatish Balay #undef __FUNCT__ 5984a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense" 599dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 600289bc588SBarry Smith { 601c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 60287828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 603dfbe8321SBarry Smith PetscErrorCode ierr; 6040805154bSBarry Smith PetscBLASInt m, n, _One=1; 60587828ca2SBarry Smith PetscScalar _DOne=1.0; 6063a40ed3dSBarry Smith 6073a40ed3dSBarry Smith PetscFunctionBegin; 608d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 609d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 610d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 611600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 6121ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 6131ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 61471044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 6151ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6161ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 617d0f46423SBarry Smith ierr = PetscLogFlops(2*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 6183a40ed3dSBarry Smith PetscFunctionReturn(0); 619289bc588SBarry Smith } 620289bc588SBarry Smith 621289bc588SBarry Smith /* -----------------------------------------------------------------*/ 6224a2ae208SSatish Balay #undef __FUNCT__ 6234a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense" 62413f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 625289bc588SBarry Smith { 626c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 62787828ca2SBarry Smith PetscScalar *v; 6286849ba73SBarry Smith PetscErrorCode ierr; 62913f74950SBarry Smith PetscInt i; 63067e560aaSBarry Smith 6313a40ed3dSBarry Smith PetscFunctionBegin; 632d0f46423SBarry Smith *ncols = A->cmap->n; 633289bc588SBarry Smith if (cols) { 634d0f46423SBarry Smith ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr); 635d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 636289bc588SBarry Smith } 637289bc588SBarry Smith if (vals) { 638d0f46423SBarry Smith ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr); 639289bc588SBarry Smith v = mat->v + row; 640d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 641289bc588SBarry Smith } 6423a40ed3dSBarry Smith PetscFunctionReturn(0); 643289bc588SBarry Smith } 6446ee01492SSatish Balay 6454a2ae208SSatish Balay #undef __FUNCT__ 6464a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense" 64713f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 648289bc588SBarry Smith { 649dfbe8321SBarry Smith PetscErrorCode ierr; 650606d414cSSatish Balay PetscFunctionBegin; 651606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 652606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 6533a40ed3dSBarry Smith PetscFunctionReturn(0); 654289bc588SBarry Smith } 655289bc588SBarry Smith /* ----------------------------------------------------------------*/ 6564a2ae208SSatish Balay #undef __FUNCT__ 6574a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense" 65813f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 659289bc588SBarry Smith { 660c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 66113f74950SBarry Smith PetscInt i,j,idx=0; 662d6dfbf8fSBarry Smith 6633a40ed3dSBarry Smith PetscFunctionBegin; 664289bc588SBarry Smith if (!mat->roworiented) { 665dbb450caSBarry Smith if (addv == INSERT_VALUES) { 666289bc588SBarry Smith for (j=0; j<n; j++) { 667cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 6682515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 669d0f46423SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 67058804f6dSBarry Smith #endif 671289bc588SBarry Smith for (i=0; i<m; i++) { 672cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 6732515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 674d0f46423SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 67558804f6dSBarry Smith #endif 676cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 677289bc588SBarry Smith } 678289bc588SBarry Smith } 6793a40ed3dSBarry Smith } else { 680289bc588SBarry Smith for (j=0; j<n; j++) { 681cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 6822515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 683d0f46423SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 68458804f6dSBarry Smith #endif 685289bc588SBarry Smith for (i=0; i<m; i++) { 686cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 6872515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 688d0f46423SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 68958804f6dSBarry Smith #endif 690cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 691289bc588SBarry Smith } 692289bc588SBarry Smith } 693289bc588SBarry Smith } 6943a40ed3dSBarry Smith } else { 695dbb450caSBarry Smith if (addv == INSERT_VALUES) { 696e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 697cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 6982515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 699d0f46423SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 70058804f6dSBarry Smith #endif 701e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 702cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 7032515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 704d0f46423SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 70558804f6dSBarry Smith #endif 706cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 707e8d4e0b9SBarry Smith } 708e8d4e0b9SBarry Smith } 7093a40ed3dSBarry Smith } else { 710289bc588SBarry Smith for (i=0; i<m; i++) { 711cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 7122515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 713d0f46423SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 71458804f6dSBarry Smith #endif 715289bc588SBarry Smith for (j=0; j<n; j++) { 716cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 7172515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 718d0f46423SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 71958804f6dSBarry Smith #endif 720cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 721289bc588SBarry Smith } 722289bc588SBarry Smith } 723289bc588SBarry Smith } 724e8d4e0b9SBarry Smith } 7253a40ed3dSBarry Smith PetscFunctionReturn(0); 726289bc588SBarry Smith } 727e8d4e0b9SBarry Smith 7284a2ae208SSatish Balay #undef __FUNCT__ 7294a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense" 73013f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 731ae80bb75SLois Curfman McInnes { 732ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 73313f74950SBarry Smith PetscInt i,j; 734ae80bb75SLois Curfman McInnes 7353a40ed3dSBarry Smith PetscFunctionBegin; 736ae80bb75SLois Curfman McInnes /* row-oriented output */ 737ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 73897e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 739d0f46423SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested larger than number rows %D",indexm[i],A->rmap->n); 740ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 7416f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 742d0f46423SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column %D requested larger than number columns %D",indexn[j],A->cmap->n); 74397e567efSBarry Smith *v++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 744ae80bb75SLois Curfman McInnes } 745ae80bb75SLois Curfman McInnes } 7463a40ed3dSBarry Smith PetscFunctionReturn(0); 747ae80bb75SLois Curfman McInnes } 748ae80bb75SLois Curfman McInnes 749289bc588SBarry Smith /* -----------------------------------------------------------------*/ 750289bc588SBarry Smith 751e090d566SSatish Balay #include "petscsys.h" 75288e32edaSLois Curfman McInnes 7534a2ae208SSatish Balay #undef __FUNCT__ 7544a2ae208SSatish Balay #define __FUNCT__ "MatLoad_SeqDense" 755a313700dSBarry Smith PetscErrorCode MatLoad_SeqDense(PetscViewer viewer, const MatType type,Mat *A) 75688e32edaSLois Curfman McInnes { 75788e32edaSLois Curfman McInnes Mat_SeqDense *a; 75888e32edaSLois Curfman McInnes Mat B; 7596849ba73SBarry Smith PetscErrorCode ierr; 76013f74950SBarry Smith PetscInt *scols,i,j,nz,header[4]; 76113f74950SBarry Smith int fd; 76213f74950SBarry Smith PetscMPIInt size; 76313f74950SBarry Smith PetscInt *rowlengths = 0,M,N,*cols; 76487828ca2SBarry Smith PetscScalar *vals,*svals,*v,*w; 76519bcc07fSBarry Smith MPI_Comm comm = ((PetscObject)viewer)->comm; 76688e32edaSLois Curfman McInnes 7673a40ed3dSBarry Smith PetscFunctionBegin; 768d132466eSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 76929bbc08cSBarry Smith if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"view must have one processor"); 770b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 7710752156aSBarry Smith ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 772552e946dSBarry Smith if (header[0] != MAT_FILE_COOKIE) SETERRQ(PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 77388e32edaSLois Curfman McInnes M = header[1]; N = header[2]; nz = header[3]; 77488e32edaSLois Curfman McInnes 77590ace30eSBarry Smith if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 776f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 777f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,M,N,M,N);CHKERRQ(ierr); 778be5d1d56SKris Buschelman ierr = MatSetType(*A,type);CHKERRQ(ierr); 7795c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(*A,PETSC_NULL);CHKERRQ(ierr); 78090ace30eSBarry Smith B = *A; 78190ace30eSBarry Smith a = (Mat_SeqDense*)B->data; 7824a41a4d3SSatish Balay v = a->v; 7834a41a4d3SSatish Balay /* Allocate some temp space to read in the values and then flip them 7844a41a4d3SSatish Balay from row major to column major */ 785b72907f3SBarry Smith ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr); 78690ace30eSBarry Smith /* read in nonzero values */ 7874a41a4d3SSatish Balay ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 7884a41a4d3SSatish Balay /* now flip the values and store them in the matrix*/ 7894a41a4d3SSatish Balay for (j=0; j<N; j++) { 7904a41a4d3SSatish Balay for (i=0; i<M; i++) { 7914a41a4d3SSatish Balay *v++ =w[i*N+j]; 7924a41a4d3SSatish Balay } 7934a41a4d3SSatish Balay } 794606d414cSSatish Balay ierr = PetscFree(w);CHKERRQ(ierr); 7956d4a8577SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 7966d4a8577SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 79790ace30eSBarry Smith } else { 79888e32edaSLois Curfman McInnes /* read row lengths */ 79913f74950SBarry Smith ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr); 8000752156aSBarry Smith ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 80188e32edaSLois Curfman McInnes 80288e32edaSLois Curfman McInnes /* create our matrix */ 803f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 804f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,M,N,M,N);CHKERRQ(ierr); 805be5d1d56SKris Buschelman ierr = MatSetType(*A,type);CHKERRQ(ierr); 8065c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(*A,PETSC_NULL);CHKERRQ(ierr); 80788e32edaSLois Curfman McInnes B = *A; 80888e32edaSLois Curfman McInnes a = (Mat_SeqDense*)B->data; 80988e32edaSLois Curfman McInnes v = a->v; 81088e32edaSLois Curfman McInnes 81188e32edaSLois Curfman McInnes /* read column indices and nonzeros */ 81213f74950SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr); 813b0a32e0cSBarry Smith cols = scols; 8140752156aSBarry Smith ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 81587828ca2SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr); 816b0a32e0cSBarry Smith vals = svals; 8170752156aSBarry Smith ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 81888e32edaSLois Curfman McInnes 81988e32edaSLois Curfman McInnes /* insert into matrix */ 82088e32edaSLois Curfman McInnes for (i=0; i<M; i++) { 82188e32edaSLois Curfman McInnes for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 82288e32edaSLois Curfman McInnes svals += rowlengths[i]; scols += rowlengths[i]; 82388e32edaSLois Curfman McInnes } 824606d414cSSatish Balay ierr = PetscFree(vals);CHKERRQ(ierr); 825606d414cSSatish Balay ierr = PetscFree(cols);CHKERRQ(ierr); 826606d414cSSatish Balay ierr = PetscFree(rowlengths);CHKERRQ(ierr); 82788e32edaSLois Curfman McInnes 8286d4a8577SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 8296d4a8577SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 83090ace30eSBarry Smith } 8313a40ed3dSBarry Smith PetscFunctionReturn(0); 83288e32edaSLois Curfman McInnes } 83388e32edaSLois Curfman McInnes 834e090d566SSatish Balay #include "petscsys.h" 835932b0c3eSLois Curfman McInnes 8364a2ae208SSatish Balay #undef __FUNCT__ 8374a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII" 8386849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 839289bc588SBarry Smith { 840932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 841dfbe8321SBarry Smith PetscErrorCode ierr; 84213f74950SBarry Smith PetscInt i,j; 8432dcb1b2aSMatthew Knepley const char *name; 84487828ca2SBarry Smith PetscScalar *v; 845f3ef73ceSBarry Smith PetscViewerFormat format; 8465f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 8475f481a85SSatish Balay PetscTruth allreal = PETSC_TRUE; 8485f481a85SSatish Balay #endif 849932b0c3eSLois Curfman McInnes 8503a40ed3dSBarry Smith PetscFunctionBegin; 851435da068SBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 852b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 853456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 8543a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 855fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 856b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 857d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 85844cd7ae7SLois Curfman McInnes v = a->v + i; 85977431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 860d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 861aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 862329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 863a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 864329f5518SBarry Smith } else if (PetscRealPart(*v)) { 865a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr); 8666831982aSBarry Smith } 86780cd9d93SLois Curfman McInnes #else 8686831982aSBarry Smith if (*v) { 869a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr); 8706831982aSBarry Smith } 87180cd9d93SLois Curfman McInnes #endif 8721b807ce4Svictorle v += a->lda; 87380cd9d93SLois Curfman McInnes } 874b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 87580cd9d93SLois Curfman McInnes } 876b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 8773a40ed3dSBarry Smith } else { 878b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 879aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 88047989497SBarry Smith /* determine if matrix has all real values */ 88147989497SBarry Smith v = a->v; 882d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 883ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;} 88447989497SBarry Smith } 88547989497SBarry Smith #endif 886fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 8873a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 888d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 889d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 890fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 891ffac6cdbSBarry Smith } 892ffac6cdbSBarry Smith 893d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 894932b0c3eSLois Curfman McInnes v = a->v + i; 895d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 896aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 89747989497SBarry Smith if (allreal) { 898f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",PetscRealPart(*v));CHKERRQ(ierr); 89947989497SBarry Smith } else { 900f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16e i ",PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 90147989497SBarry Smith } 902289bc588SBarry Smith #else 903f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",*v);CHKERRQ(ierr); 904289bc588SBarry Smith #endif 9051b807ce4Svictorle v += a->lda; 906289bc588SBarry Smith } 907b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 908289bc588SBarry Smith } 909fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 910b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 911ffac6cdbSBarry Smith } 912b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 913da3a660dSBarry Smith } 914b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 9153a40ed3dSBarry Smith PetscFunctionReturn(0); 916289bc588SBarry Smith } 917289bc588SBarry Smith 9184a2ae208SSatish Balay #undef __FUNCT__ 9194a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary" 9206849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 921932b0c3eSLois Curfman McInnes { 922932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 9236849ba73SBarry Smith PetscErrorCode ierr; 92413f74950SBarry Smith int fd; 925d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 92687828ca2SBarry Smith PetscScalar *v,*anonz,*vals; 927f3ef73ceSBarry Smith PetscViewerFormat format; 928932b0c3eSLois Curfman McInnes 9293a40ed3dSBarry Smith PetscFunctionBegin; 930b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 93190ace30eSBarry Smith 932b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 933fb9695e5SSatish Balay if (format == PETSC_VIEWER_BINARY_NATIVE) { 93490ace30eSBarry Smith /* store the matrix as a dense matrix */ 93513f74950SBarry Smith ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 936552e946dSBarry Smith col_lens[0] = MAT_FILE_COOKIE; 93790ace30eSBarry Smith col_lens[1] = m; 93890ace30eSBarry Smith col_lens[2] = n; 93990ace30eSBarry Smith col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 9406f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 941606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 94290ace30eSBarry Smith 94390ace30eSBarry Smith /* write out matrix, by rows */ 94487828ca2SBarry Smith ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr); 94590ace30eSBarry Smith v = a->v; 94690ace30eSBarry Smith for (j=0; j<n; j++) { 947578230a0SSatish Balay for (i=0; i<m; i++) { 948578230a0SSatish Balay vals[j + i*n] = *v++; 94990ace30eSBarry Smith } 95090ace30eSBarry Smith } 9516f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 952606d414cSSatish Balay ierr = PetscFree(vals);CHKERRQ(ierr); 95390ace30eSBarry Smith } else { 95413f74950SBarry Smith ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 955552e946dSBarry Smith col_lens[0] = MAT_FILE_COOKIE; 956932b0c3eSLois Curfman McInnes col_lens[1] = m; 957932b0c3eSLois Curfman McInnes col_lens[2] = n; 958932b0c3eSLois Curfman McInnes col_lens[3] = nz; 959932b0c3eSLois Curfman McInnes 960932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 961932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 9626f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 963932b0c3eSLois Curfman McInnes 964932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 965932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 966932b0c3eSLois Curfman McInnes ict = 0; 967932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 968932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 969932b0c3eSLois Curfman McInnes } 9706f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 971606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 972932b0c3eSLois Curfman McInnes 973932b0c3eSLois Curfman McInnes /* store nonzero values */ 97487828ca2SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr); 975932b0c3eSLois Curfman McInnes ict = 0; 976932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 977932b0c3eSLois Curfman McInnes v = a->v + i; 978932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 9791b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 980932b0c3eSLois Curfman McInnes } 981932b0c3eSLois Curfman McInnes } 9826f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 983606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 98490ace30eSBarry Smith } 9853a40ed3dSBarry Smith PetscFunctionReturn(0); 986932b0c3eSLois Curfman McInnes } 987932b0c3eSLois Curfman McInnes 9884a2ae208SSatish Balay #undef __FUNCT__ 9894a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom" 990dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 991f1af5d2fSBarry Smith { 992f1af5d2fSBarry Smith Mat A = (Mat) Aa; 993f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 9946849ba73SBarry Smith PetscErrorCode ierr; 995d0f46423SBarry Smith PetscInt m = A->rmap->n,n = A->cmap->n,color,i,j; 99687828ca2SBarry Smith PetscScalar *v = a->v; 997b0a32e0cSBarry Smith PetscViewer viewer; 998b0a32e0cSBarry Smith PetscDraw popup; 999329f5518SBarry Smith PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0; 1000f3ef73ceSBarry Smith PetscViewerFormat format; 1001f1af5d2fSBarry Smith 1002f1af5d2fSBarry Smith PetscFunctionBegin; 1003f1af5d2fSBarry Smith 1004f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1005b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1006b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1007f1af5d2fSBarry Smith 1008f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1009fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1010f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1011b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1012f1af5d2fSBarry Smith for(j = 0; j < n; j++) { 1013f1af5d2fSBarry Smith x_l = j; 1014f1af5d2fSBarry Smith x_r = x_l + 1.0; 1015f1af5d2fSBarry Smith for(i = 0; i < m; i++) { 1016f1af5d2fSBarry Smith y_l = m - i - 1.0; 1017f1af5d2fSBarry Smith y_r = y_l + 1.0; 1018f1af5d2fSBarry Smith #if defined(PETSC_USE_COMPLEX) 1019329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1020b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1021329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1022b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1023f1af5d2fSBarry Smith } else { 1024f1af5d2fSBarry Smith continue; 1025f1af5d2fSBarry Smith } 1026f1af5d2fSBarry Smith #else 1027f1af5d2fSBarry Smith if (v[j*m+i] > 0.) { 1028b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1029f1af5d2fSBarry Smith } else if (v[j*m+i] < 0.) { 1030b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1031f1af5d2fSBarry Smith } else { 1032f1af5d2fSBarry Smith continue; 1033f1af5d2fSBarry Smith } 1034f1af5d2fSBarry Smith #endif 1035b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1036f1af5d2fSBarry Smith } 1037f1af5d2fSBarry Smith } 1038f1af5d2fSBarry Smith } else { 1039f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1040f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1041f1af5d2fSBarry Smith for(i = 0; i < m*n; i++) { 1042f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1043f1af5d2fSBarry Smith } 1044b0a32e0cSBarry Smith scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv; 1045b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 1046b0a32e0cSBarry Smith if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);} 1047f1af5d2fSBarry Smith for(j = 0; j < n; j++) { 1048f1af5d2fSBarry Smith x_l = j; 1049f1af5d2fSBarry Smith x_r = x_l + 1.0; 1050f1af5d2fSBarry Smith for(i = 0; i < m; i++) { 1051f1af5d2fSBarry Smith y_l = m - i - 1.0; 1052f1af5d2fSBarry Smith y_r = y_l + 1.0; 1053b0a32e0cSBarry Smith color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i])); 1054b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1055f1af5d2fSBarry Smith } 1056f1af5d2fSBarry Smith } 1057f1af5d2fSBarry Smith } 1058f1af5d2fSBarry Smith PetscFunctionReturn(0); 1059f1af5d2fSBarry Smith } 1060f1af5d2fSBarry Smith 10614a2ae208SSatish Balay #undef __FUNCT__ 10624a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 1063dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1064f1af5d2fSBarry Smith { 1065b0a32e0cSBarry Smith PetscDraw draw; 1066f1af5d2fSBarry Smith PetscTruth isnull; 1067329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1068dfbe8321SBarry Smith PetscErrorCode ierr; 1069f1af5d2fSBarry Smith 1070f1af5d2fSBarry Smith PetscFunctionBegin; 1071b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1072b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1073abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1074f1af5d2fSBarry Smith 1075f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1076d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1077f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1078b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1079b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 1080f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr); 1081f1af5d2fSBarry Smith PetscFunctionReturn(0); 1082f1af5d2fSBarry Smith } 1083f1af5d2fSBarry Smith 10844a2ae208SSatish Balay #undef __FUNCT__ 10854a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 1086dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1087932b0c3eSLois Curfman McInnes { 1088dfbe8321SBarry Smith PetscErrorCode ierr; 10896805f65bSBarry Smith PetscTruth iascii,isbinary,isdraw; 1090932b0c3eSLois Curfman McInnes 10913a40ed3dSBarry Smith PetscFunctionBegin; 109232077d6dSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 1093fb9695e5SSatish Balay ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr); 1094fb9695e5SSatish Balay ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_DRAW,&isdraw);CHKERRQ(ierr); 10950f5bd95cSBarry Smith 1096c45a1595SBarry Smith if (iascii) { 1097c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 10980f5bd95cSBarry Smith } else if (isbinary) { 10993a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1100f1af5d2fSBarry Smith } else if (isdraw) { 1101f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 11025cd90555SBarry Smith } else { 1103958c9bccSBarry Smith SETERRQ1(PETSC_ERR_SUP,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name); 1104932b0c3eSLois Curfman McInnes } 11053a40ed3dSBarry Smith PetscFunctionReturn(0); 1106932b0c3eSLois Curfman McInnes } 1107289bc588SBarry Smith 11084a2ae208SSatish Balay #undef __FUNCT__ 11094a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1110dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat) 1111289bc588SBarry Smith { 1112ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1113dfbe8321SBarry Smith PetscErrorCode ierr; 111490f02eecSBarry Smith 11153a40ed3dSBarry Smith PetscFunctionBegin; 1116aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1117d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1118a5a9c739SBarry Smith #endif 111905b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 11206857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1121606d414cSSatish Balay ierr = PetscFree(l);CHKERRQ(ierr); 1122dbd8c25aSHong Zhang 1123dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1124901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr); 11254ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMult_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11264ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11274ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11283a40ed3dSBarry Smith PetscFunctionReturn(0); 1129289bc588SBarry Smith } 1130289bc588SBarry Smith 11314a2ae208SSatish Balay #undef __FUNCT__ 11324a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1133fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1134289bc588SBarry Smith { 1135c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 11366849ba73SBarry Smith PetscErrorCode ierr; 113713f74950SBarry Smith PetscInt k,j,m,n,M; 113887828ca2SBarry Smith PetscScalar *v,tmp; 113948b35521SBarry Smith 11403a40ed3dSBarry Smith PetscFunctionBegin; 1141d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 1142e9695a30SBarry Smith if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */ 1143a5ce6ee0Svictorle if (m != n) { 1144634064b4SBarry Smith SETERRQ(PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1145d64ed03dSBarry Smith } else { 1146d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1147289bc588SBarry Smith for (k=0; k<j; k++) { 11481b807ce4Svictorle tmp = v[j + k*M]; 11491b807ce4Svictorle v[j + k*M] = v[k + j*M]; 11501b807ce4Svictorle v[k + j*M] = tmp; 1151289bc588SBarry Smith } 1152289bc588SBarry Smith } 1153d64ed03dSBarry Smith } 11543a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1155d3e5ee88SLois Curfman McInnes Mat tmat; 1156ec8511deSBarry Smith Mat_SeqDense *tmatd; 115787828ca2SBarry Smith PetscScalar *v2; 1158ea709b57SSatish Balay 1159fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX) { 11607adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,&tmat);CHKERRQ(ierr); 1161d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 11627adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 11635c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr); 1164fc4dec0aSBarry Smith } else { 1165fc4dec0aSBarry Smith tmat = *matout; 1166fc4dec0aSBarry Smith } 1167ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 11680de55854SLois Curfman McInnes v = mat->v; v2 = tmatd->v; 1169d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 11701b807ce4Svictorle for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M]; 1171d3e5ee88SLois Curfman McInnes } 11726d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 11736d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1174d3e5ee88SLois Curfman McInnes *matout = tmat; 117548b35521SBarry Smith } 11763a40ed3dSBarry Smith PetscFunctionReturn(0); 1177289bc588SBarry Smith } 1178289bc588SBarry Smith 11794a2ae208SSatish Balay #undef __FUNCT__ 11804a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1181dfbe8321SBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscTruth *flg) 1182289bc588SBarry Smith { 1183c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1184c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 118513f74950SBarry Smith PetscInt i,j; 118687828ca2SBarry Smith PetscScalar *v1 = mat1->v,*v2 = mat2->v; 11879ea5d5aeSSatish Balay 11883a40ed3dSBarry Smith PetscFunctionBegin; 1189d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1190d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1191d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 11921b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1193d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 11943a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 11951b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 11961b807ce4Svictorle } 1197289bc588SBarry Smith } 119877c4ece6SBarry Smith *flg = PETSC_TRUE; 11993a40ed3dSBarry Smith PetscFunctionReturn(0); 1200289bc588SBarry Smith } 1201289bc588SBarry Smith 12024a2ae208SSatish Balay #undef __FUNCT__ 12034a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1204dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1205289bc588SBarry Smith { 1206c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1207dfbe8321SBarry Smith PetscErrorCode ierr; 120813f74950SBarry Smith PetscInt i,n,len; 120987828ca2SBarry Smith PetscScalar *x,zero = 0.0; 121044cd7ae7SLois Curfman McInnes 12113a40ed3dSBarry Smith PetscFunctionBegin; 12122dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 12137a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 12141ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1215d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1216d0f46423SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 121744cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 12181b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1219289bc588SBarry Smith } 12201ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 12213a40ed3dSBarry Smith PetscFunctionReturn(0); 1222289bc588SBarry Smith } 1223289bc588SBarry Smith 12244a2ae208SSatish Balay #undef __FUNCT__ 12254a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1226dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1227289bc588SBarry Smith { 1228c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 122987828ca2SBarry Smith PetscScalar *l,*r,x,*v; 1230dfbe8321SBarry Smith PetscErrorCode ierr; 1231d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 123255659b69SBarry Smith 12333a40ed3dSBarry Smith PetscFunctionBegin; 123428988994SBarry Smith if (ll) { 12357a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 12361ebc52fbSHong Zhang ierr = VecGetArray(ll,&l);CHKERRQ(ierr); 1237d0f46423SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1238da3a660dSBarry Smith for (i=0; i<m; i++) { 1239da3a660dSBarry Smith x = l[i]; 1240da3a660dSBarry Smith v = mat->v + i; 1241da3a660dSBarry Smith for (j=0; j<n; j++) { (*v) *= x; v+= m;} 1242da3a660dSBarry Smith } 12431ebc52fbSHong Zhang ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr); 1244efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1245da3a660dSBarry Smith } 124628988994SBarry Smith if (rr) { 12477a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 12481ebc52fbSHong Zhang ierr = VecGetArray(rr,&r);CHKERRQ(ierr); 1249d0f46423SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1250da3a660dSBarry Smith for (i=0; i<n; i++) { 1251da3a660dSBarry Smith x = r[i]; 1252da3a660dSBarry Smith v = mat->v + i*m; 1253da3a660dSBarry Smith for (j=0; j<m; j++) { (*v++) *= x;} 1254da3a660dSBarry Smith } 12551ebc52fbSHong Zhang ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr); 1256efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1257da3a660dSBarry Smith } 12583a40ed3dSBarry Smith PetscFunctionReturn(0); 1259289bc588SBarry Smith } 1260289bc588SBarry Smith 12614a2ae208SSatish Balay #undef __FUNCT__ 12624a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1263dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1264289bc588SBarry Smith { 1265c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 126687828ca2SBarry Smith PetscScalar *v = mat->v; 1267329f5518SBarry Smith PetscReal sum = 0.0; 1268d0f46423SBarry Smith PetscInt lda=mat->lda,m=A->rmap->n,i,j; 1269efee365bSSatish Balay PetscErrorCode ierr; 127055659b69SBarry Smith 12713a40ed3dSBarry Smith PetscFunctionBegin; 1272289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1273a5ce6ee0Svictorle if (lda>m) { 1274d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1275a5ce6ee0Svictorle v = mat->v+j*lda; 1276a5ce6ee0Svictorle for (i=0; i<m; i++) { 1277a5ce6ee0Svictorle #if defined(PETSC_USE_COMPLEX) 1278a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1279a5ce6ee0Svictorle #else 1280a5ce6ee0Svictorle sum += (*v)*(*v); v++; 1281a5ce6ee0Svictorle #endif 1282a5ce6ee0Svictorle } 1283a5ce6ee0Svictorle } 1284a5ce6ee0Svictorle } else { 1285d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1286aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1287329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1288289bc588SBarry Smith #else 1289289bc588SBarry Smith sum += (*v)*(*v); v++; 1290289bc588SBarry Smith #endif 1291289bc588SBarry Smith } 1292a5ce6ee0Svictorle } 1293064f8208SBarry Smith *nrm = sqrt(sum); 1294d0f46423SBarry Smith ierr = PetscLogFlops(2*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 12953a40ed3dSBarry Smith } else if (type == NORM_1) { 1296064f8208SBarry Smith *nrm = 0.0; 1297d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 12981b807ce4Svictorle v = mat->v + j*mat->lda; 1299289bc588SBarry Smith sum = 0.0; 1300d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 130133a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1302289bc588SBarry Smith } 1303064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1304289bc588SBarry Smith } 1305d0f46423SBarry Smith ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13063a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1307064f8208SBarry Smith *nrm = 0.0; 1308d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1309289bc588SBarry Smith v = mat->v + j; 1310289bc588SBarry Smith sum = 0.0; 1311d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 13121b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1313289bc588SBarry Smith } 1314064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1315289bc588SBarry Smith } 1316d0f46423SBarry Smith ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13173a40ed3dSBarry Smith } else { 131829bbc08cSBarry Smith SETERRQ(PETSC_ERR_SUP,"No two norm"); 1319289bc588SBarry Smith } 13203a40ed3dSBarry Smith PetscFunctionReturn(0); 1321289bc588SBarry Smith } 1322289bc588SBarry Smith 13234a2ae208SSatish Balay #undef __FUNCT__ 13244a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 13254e0d8c25SBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscTruth flg) 1326289bc588SBarry Smith { 1327c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 132863ba0a88SBarry Smith PetscErrorCode ierr; 132967e560aaSBarry Smith 13303a40ed3dSBarry Smith PetscFunctionBegin; 1331b5a2b587SKris Buschelman switch (op) { 1332b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 13334e0d8c25SBarry Smith aij->roworiented = flg; 1334b5a2b587SKris Buschelman break; 1335512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1336b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 13373971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 13384e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 1339b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1340b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 134177e54ba9SKris Buschelman case MAT_SYMMETRIC: 134277e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 13439a4540c5SBarry Smith case MAT_HERMITIAN: 13449a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 1345600fe468SBarry Smith case MAT_IGNORE_LOWER_TRIANGULAR: 1346290bbb0aSBarry Smith ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 134777e54ba9SKris Buschelman break; 1348b5a2b587SKris Buschelman default: 1349600fe468SBarry Smith SETERRQ1(PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 13503a40ed3dSBarry Smith } 13513a40ed3dSBarry Smith PetscFunctionReturn(0); 1352289bc588SBarry Smith } 1353289bc588SBarry Smith 13544a2ae208SSatish Balay #undef __FUNCT__ 13554a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1356dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A) 13576f0a148fSBarry Smith { 1358ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 13596849ba73SBarry Smith PetscErrorCode ierr; 1360d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 13613a40ed3dSBarry Smith 13623a40ed3dSBarry Smith PetscFunctionBegin; 1363a5ce6ee0Svictorle if (lda>m) { 1364d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1365a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1366a5ce6ee0Svictorle } 1367a5ce6ee0Svictorle } else { 1368d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1369a5ce6ee0Svictorle } 13703a40ed3dSBarry Smith PetscFunctionReturn(0); 13716f0a148fSBarry Smith } 13726f0a148fSBarry Smith 13734a2ae208SSatish Balay #undef __FUNCT__ 13744a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 1375f4df32b1SMatthew Knepley PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag) 13766f0a148fSBarry Smith { 1377ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1378d0f46423SBarry Smith PetscInt n = A->cmap->n,i,j; 137987828ca2SBarry Smith PetscScalar *slot; 138055659b69SBarry Smith 13813a40ed3dSBarry Smith PetscFunctionBegin; 13826f0a148fSBarry Smith for (i=0; i<N; i++) { 13836f0a148fSBarry Smith slot = l->v + rows[i]; 13846f0a148fSBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += n;} 13856f0a148fSBarry Smith } 1386f4df32b1SMatthew Knepley if (diag != 0.0) { 13876f0a148fSBarry Smith for (i=0; i<N; i++) { 13886f0a148fSBarry Smith slot = l->v + (n+1)*rows[i]; 1389f4df32b1SMatthew Knepley *slot = diag; 13906f0a148fSBarry Smith } 13916f0a148fSBarry Smith } 13923a40ed3dSBarry Smith PetscFunctionReturn(0); 13936f0a148fSBarry Smith } 1394557bce09SLois Curfman McInnes 13954a2ae208SSatish Balay #undef __FUNCT__ 13964a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqDense" 1397dfbe8321SBarry Smith PetscErrorCode MatGetArray_SeqDense(Mat A,PetscScalar *array[]) 139864e87e97SBarry Smith { 1399c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 14003a40ed3dSBarry Smith 14013a40ed3dSBarry Smith PetscFunctionBegin; 1402d0f46423SBarry Smith if (mat->lda != A->rmap->n) SETERRQ(PETSC_ERR_SUP,"Cannot get array for Dense matrices with LDA different from number of rows"); 140364e87e97SBarry Smith *array = mat->v; 14043a40ed3dSBarry Smith PetscFunctionReturn(0); 140564e87e97SBarry Smith } 14060754003eSLois Curfman McInnes 14074a2ae208SSatish Balay #undef __FUNCT__ 14084a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense" 1409dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1410ff14e315SSatish Balay { 14113a40ed3dSBarry Smith PetscFunctionBegin; 141209b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 14133a40ed3dSBarry Smith PetscFunctionReturn(0); 1414ff14e315SSatish Balay } 14150754003eSLois Curfman McInnes 14164a2ae208SSatish Balay #undef __FUNCT__ 14174a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 141813f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 14190754003eSLois Curfman McInnes { 1420c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 14216849ba73SBarry Smith PetscErrorCode ierr; 142221a2c019SBarry Smith PetscInt i,j,*irow,*icol,nrows,ncols; 142387828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 14240754003eSLois Curfman McInnes Mat newmat; 14250754003eSLois Curfman McInnes 14263a40ed3dSBarry Smith PetscFunctionBegin; 142778b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 142878b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1429e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1430e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 14310754003eSLois Curfman McInnes 1432182d2002SSatish Balay /* Check submatrixcall */ 1433182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 143413f74950SBarry Smith PetscInt n_cols,n_rows; 1435182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 143621a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 143721a2c019SBarry Smith /* resize the result result matrix to match number of requested rows/columns */ 143821a2c019SBarry Smith ierr = MatSetSizes(*B,nrows,nrows,nrows,nrows);CHKERRQ(ierr); 143921a2c019SBarry Smith } 1440182d2002SSatish Balay newmat = *B; 1441182d2002SSatish Balay } else { 14420754003eSLois Curfman McInnes /* Create and fill new matrix */ 14437adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,&newmat);CHKERRQ(ierr); 1444f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 14457adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 14465c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr); 1447182d2002SSatish Balay } 1448182d2002SSatish Balay 1449182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1450182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1451182d2002SSatish Balay 1452182d2002SSatish Balay for (i=0; i<ncols; i++) { 14536de62eeeSBarry Smith av = v + mat->lda*icol[i]; 1454182d2002SSatish Balay for (j=0; j<nrows; j++) { 1455182d2002SSatish Balay *bv++ = av[irow[j]]; 14560754003eSLois Curfman McInnes } 14570754003eSLois Curfman McInnes } 1458182d2002SSatish Balay 1459182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 14606d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 14616d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 14620754003eSLois Curfman McInnes 14630754003eSLois Curfman McInnes /* Free work space */ 146478b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 146578b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1466182d2002SSatish Balay *B = newmat; 14673a40ed3dSBarry Smith PetscFunctionReturn(0); 14680754003eSLois Curfman McInnes } 14690754003eSLois Curfman McInnes 14704a2ae208SSatish Balay #undef __FUNCT__ 14714a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 147213f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1473905e6a2fSBarry Smith { 14746849ba73SBarry Smith PetscErrorCode ierr; 147513f74950SBarry Smith PetscInt i; 1476905e6a2fSBarry Smith 14773a40ed3dSBarry Smith PetscFunctionBegin; 1478905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1479b0a32e0cSBarry Smith ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr); 1480905e6a2fSBarry Smith } 1481905e6a2fSBarry Smith 1482905e6a2fSBarry Smith for (i=0; i<n; i++) { 14836a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1484905e6a2fSBarry Smith } 14853a40ed3dSBarry Smith PetscFunctionReturn(0); 1486905e6a2fSBarry Smith } 1487905e6a2fSBarry Smith 14884a2ae208SSatish Balay #undef __FUNCT__ 1489c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1490c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1491c0aa2d19SHong Zhang { 1492c0aa2d19SHong Zhang PetscFunctionBegin; 1493c0aa2d19SHong Zhang PetscFunctionReturn(0); 1494c0aa2d19SHong Zhang } 1495c0aa2d19SHong Zhang 1496c0aa2d19SHong Zhang #undef __FUNCT__ 1497c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1498c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1499c0aa2d19SHong Zhang { 1500c0aa2d19SHong Zhang PetscFunctionBegin; 1501c0aa2d19SHong Zhang PetscFunctionReturn(0); 1502c0aa2d19SHong Zhang } 1503c0aa2d19SHong Zhang 1504c0aa2d19SHong Zhang #undef __FUNCT__ 15054a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1506dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 15074b0e389bSBarry Smith { 15084b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data; 15096849ba73SBarry Smith PetscErrorCode ierr; 1510d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 15113a40ed3dSBarry Smith 15123a40ed3dSBarry Smith PetscFunctionBegin; 151333f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 151433f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1515cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 15163a40ed3dSBarry Smith PetscFunctionReturn(0); 15173a40ed3dSBarry Smith } 1518d0f46423SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1519a5ce6ee0Svictorle if (lda1>m || lda2>m) { 15200dbb7854Svictorle for (j=0; j<n; j++) { 1521a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1522a5ce6ee0Svictorle } 1523a5ce6ee0Svictorle } else { 1524d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1525a5ce6ee0Svictorle } 1526273d9f13SBarry Smith PetscFunctionReturn(0); 1527273d9f13SBarry Smith } 1528273d9f13SBarry Smith 15294a2ae208SSatish Balay #undef __FUNCT__ 15304a2ae208SSatish Balay #define __FUNCT__ "MatSetUpPreallocation_SeqDense" 1531dfbe8321SBarry Smith PetscErrorCode MatSetUpPreallocation_SeqDense(Mat A) 1532273d9f13SBarry Smith { 1533dfbe8321SBarry Smith PetscErrorCode ierr; 1534273d9f13SBarry Smith 1535273d9f13SBarry Smith PetscFunctionBegin; 1536273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 15373a40ed3dSBarry Smith PetscFunctionReturn(0); 15384b0e389bSBarry Smith } 15394b0e389bSBarry Smith 1540284134d9SBarry Smith #undef __FUNCT__ 1541284134d9SBarry Smith #define __FUNCT__ "MatSetSizes_SeqDense" 1542284134d9SBarry Smith PetscErrorCode MatSetSizes_SeqDense(Mat A,PetscInt m,PetscInt n,PetscInt M,PetscInt N) 1543284134d9SBarry Smith { 1544284134d9SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 154521a2c019SBarry Smith PetscErrorCode ierr; 1546284134d9SBarry Smith PetscFunctionBegin; 154721a2c019SBarry Smith /* this will not be called before lda, Mmax, and Nmax have been set */ 1548284134d9SBarry Smith m = PetscMax(m,M); 1549284134d9SBarry Smith n = PetscMax(n,N); 155021a2c019SBarry Smith if (m > a->Mmax) SETERRQ2(PETSC_ERR_SUP,"Cannot yet resize number rows of dense matrix larger then its initial size %d, requested %d",a->lda,(int)m); 1551284134d9SBarry Smith if (n > a->Nmax) SETERRQ2(PETSC_ERR_SUP,"Cannot yet resize number columns of dense matrix larger then its initial size %d, requested %d",a->Nmax,(int)n); 1552d0f46423SBarry Smith A->rmap->n = A->rmap->n = m; 1553d0f46423SBarry Smith A->cmap->n = A->cmap->N = n; 155421a2c019SBarry Smith if (a->changelda) a->lda = m; 155521a2c019SBarry Smith ierr = PetscMemzero(a->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr); 1556284134d9SBarry Smith PetscFunctionReturn(0); 1557284134d9SBarry Smith } 1558170fe5c8SBarry Smith 1559284134d9SBarry Smith 1560a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1561a9fe9ddaSSatish Balay #undef __FUNCT__ 1562a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1563a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1564a9fe9ddaSSatish Balay { 1565a9fe9ddaSSatish Balay PetscErrorCode ierr; 1566a9fe9ddaSSatish Balay 1567a9fe9ddaSSatish Balay PetscFunctionBegin; 1568a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX){ 1569a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1570a9fe9ddaSSatish Balay } 1571a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1572a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1573a9fe9ddaSSatish Balay } 1574a9fe9ddaSSatish Balay 1575a9fe9ddaSSatish Balay #undef __FUNCT__ 1576a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1577a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1578a9fe9ddaSSatish Balay { 1579ee16a9a1SHong Zhang PetscErrorCode ierr; 1580d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1581ee16a9a1SHong Zhang Mat Cmat; 1582a9fe9ddaSSatish Balay 1583ee16a9a1SHong Zhang PetscFunctionBegin; 1584d0f46423SBarry Smith if (A->cmap->n != B->rmap->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"A->cmap->n %d != B->rmap->n %d\n",A->cmap->n,B->rmap->n); 1585ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1586ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1587ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1588ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1589ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 1590ee16a9a1SHong Zhang *C = Cmat; 1591ee16a9a1SHong Zhang PetscFunctionReturn(0); 1592ee16a9a1SHong Zhang } 1593a9fe9ddaSSatish Balay 159498a3b096SSatish Balay #undef __FUNCT__ 1595a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1596a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1597a9fe9ddaSSatish Balay { 1598a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1599a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1600a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 16010805154bSBarry Smith PetscBLASInt m,n,k; 1602a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1603a9fe9ddaSSatish Balay 1604a9fe9ddaSSatish Balay PetscFunctionBegin; 1605d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 1606d0f46423SBarry Smith n = PetscBLASIntCast(B->cmap->n); 1607d0f46423SBarry Smith k = PetscBLASIntCast(A->cmap->n); 1608a9fe9ddaSSatish Balay BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1609a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1610a9fe9ddaSSatish Balay } 1611a9fe9ddaSSatish Balay 1612a9fe9ddaSSatish Balay #undef __FUNCT__ 1613a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTranspose_SeqDense_SeqDense" 1614a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTranspose_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1615a9fe9ddaSSatish Balay { 1616a9fe9ddaSSatish Balay PetscErrorCode ierr; 1617a9fe9ddaSSatish Balay 1618a9fe9ddaSSatish Balay PetscFunctionBegin; 1619a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX){ 1620a9fe9ddaSSatish Balay ierr = MatMatMultTransposeSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1621a9fe9ddaSSatish Balay } 1622a9fe9ddaSSatish Balay ierr = MatMatMultTransposeNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1623a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1624a9fe9ddaSSatish Balay } 1625a9fe9ddaSSatish Balay 1626a9fe9ddaSSatish Balay #undef __FUNCT__ 1627a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeSymbolic_SeqDense_SeqDense" 1628a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1629a9fe9ddaSSatish Balay { 1630ee16a9a1SHong Zhang PetscErrorCode ierr; 1631d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1632ee16a9a1SHong Zhang Mat Cmat; 1633a9fe9ddaSSatish Balay 1634ee16a9a1SHong Zhang PetscFunctionBegin; 1635d0f46423SBarry Smith if (A->rmap->n != B->rmap->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"A->rmap->n %d != B->rmap->n %d\n",A->rmap->n,B->rmap->n); 1636ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1637ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1638ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1639ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1640ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 1641ee16a9a1SHong Zhang *C = Cmat; 1642ee16a9a1SHong Zhang PetscFunctionReturn(0); 1643ee16a9a1SHong Zhang } 1644a9fe9ddaSSatish Balay 1645a9fe9ddaSSatish Balay #undef __FUNCT__ 1646a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeNumeric_SeqDense_SeqDense" 1647a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1648a9fe9ddaSSatish Balay { 1649a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1650a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1651a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 16520805154bSBarry Smith PetscBLASInt m,n,k; 1653a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1654a9fe9ddaSSatish Balay 1655a9fe9ddaSSatish Balay PetscFunctionBegin; 1656d0f46423SBarry Smith m = PetscBLASIntCast(A->cmap->n); 1657d0f46423SBarry Smith n = PetscBLASIntCast(B->cmap->n); 1658d0f46423SBarry Smith k = PetscBLASIntCast(A->rmap->n); 16592fbe02b9SBarry Smith /* 16602fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 16612fbe02b9SBarry Smith */ 1662a9fe9ddaSSatish Balay BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1663a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1664a9fe9ddaSSatish Balay } 1665985db425SBarry Smith 1666985db425SBarry Smith #undef __FUNCT__ 1667985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 1668985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1669985db425SBarry Smith { 1670985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1671985db425SBarry Smith PetscErrorCode ierr; 1672d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1673985db425SBarry Smith PetscScalar *x; 1674985db425SBarry Smith MatScalar *aa = a->v; 1675985db425SBarry Smith 1676985db425SBarry Smith PetscFunctionBegin; 1677985db425SBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1678985db425SBarry Smith 1679985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1680985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1681985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1682d0f46423SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1683985db425SBarry Smith for (i=0; i<m; i++) { 1684985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1685985db425SBarry Smith for (j=1; j<n; j++){ 1686985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1687985db425SBarry Smith } 1688985db425SBarry Smith } 1689985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1690985db425SBarry Smith PetscFunctionReturn(0); 1691985db425SBarry Smith } 1692985db425SBarry Smith 1693985db425SBarry Smith #undef __FUNCT__ 1694985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 1695985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 1696985db425SBarry Smith { 1697985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1698985db425SBarry Smith PetscErrorCode ierr; 1699d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1700985db425SBarry Smith PetscScalar *x; 1701985db425SBarry Smith PetscReal atmp; 1702985db425SBarry Smith MatScalar *aa = a->v; 1703985db425SBarry Smith 1704985db425SBarry Smith PetscFunctionBegin; 1705985db425SBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1706985db425SBarry Smith 1707985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1708985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1709985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1710d0f46423SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1711985db425SBarry Smith for (i=0; i<m; i++) { 17129189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 1713985db425SBarry Smith for (j=1; j<n; j++){ 1714985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 1715985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 1716985db425SBarry Smith } 1717985db425SBarry Smith } 1718985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1719985db425SBarry Smith PetscFunctionReturn(0); 1720985db425SBarry Smith } 1721985db425SBarry Smith 1722985db425SBarry Smith #undef __FUNCT__ 1723985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 1724985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 1725985db425SBarry Smith { 1726985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1727985db425SBarry Smith PetscErrorCode ierr; 1728d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1729985db425SBarry Smith PetscScalar *x; 1730985db425SBarry Smith MatScalar *aa = a->v; 1731985db425SBarry Smith 1732985db425SBarry Smith PetscFunctionBegin; 1733985db425SBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1734985db425SBarry Smith 1735985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1736985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1737985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1738d0f46423SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1739985db425SBarry Smith for (i=0; i<m; i++) { 1740985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1741985db425SBarry Smith for (j=1; j<n; j++){ 1742985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1743985db425SBarry Smith } 1744985db425SBarry Smith } 1745985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1746985db425SBarry Smith PetscFunctionReturn(0); 1747985db425SBarry Smith } 1748985db425SBarry Smith 17498d0534beSBarry Smith #undef __FUNCT__ 17508d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 17518d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 17528d0534beSBarry Smith { 17538d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 17548d0534beSBarry Smith PetscErrorCode ierr; 17558d0534beSBarry Smith PetscScalar *x; 17568d0534beSBarry Smith 17578d0534beSBarry Smith PetscFunctionBegin; 17588d0534beSBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 17598d0534beSBarry Smith 17608d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1761d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 17628d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 17638d0534beSBarry Smith PetscFunctionReturn(0); 17648d0534beSBarry Smith } 17658d0534beSBarry Smith 1766289bc588SBarry Smith /* -------------------------------------------------------------------*/ 1767a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense, 1768905e6a2fSBarry Smith MatGetRow_SeqDense, 1769905e6a2fSBarry Smith MatRestoreRow_SeqDense, 1770905e6a2fSBarry Smith MatMult_SeqDense, 177197304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 17727c922b88SBarry Smith MatMultTranspose_SeqDense, 17737c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 1774*db4efbfdSBarry Smith 0, 1775*db4efbfdSBarry Smith 0, 1776*db4efbfdSBarry Smith 0, 1777*db4efbfdSBarry Smith /*10*/ 0, 1778905e6a2fSBarry Smith MatLUFactor_SeqDense, 1779905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 1780ec8511deSBarry Smith MatRelax_SeqDense, 1781ec8511deSBarry Smith MatTranspose_SeqDense, 178297304618SKris Buschelman /*15*/ MatGetInfo_SeqDense, 1783905e6a2fSBarry Smith MatEqual_SeqDense, 1784905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 1785905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 1786905e6a2fSBarry Smith MatNorm_SeqDense, 1787c0aa2d19SHong Zhang /*20*/ MatAssemblyBegin_SeqDense, 1788c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 1789905e6a2fSBarry Smith 0, 1790905e6a2fSBarry Smith MatSetOption_SeqDense, 1791905e6a2fSBarry Smith MatZeroEntries_SeqDense, 179297304618SKris Buschelman /*25*/ MatZeroRows_SeqDense, 1793*db4efbfdSBarry Smith 0, 1794*db4efbfdSBarry Smith 0, 1795*db4efbfdSBarry Smith 0, 1796*db4efbfdSBarry Smith 0, 179797304618SKris Buschelman /*30*/ MatSetUpPreallocation_SeqDense, 1798273d9f13SBarry Smith 0, 1799905e6a2fSBarry Smith 0, 1800905e6a2fSBarry Smith MatGetArray_SeqDense, 1801905e6a2fSBarry Smith MatRestoreArray_SeqDense, 180297304618SKris Buschelman /*35*/ MatDuplicate_SeqDense, 1803a5ae1ecdSBarry Smith 0, 1804a5ae1ecdSBarry Smith 0, 1805a5ae1ecdSBarry Smith 0, 1806a5ae1ecdSBarry Smith 0, 180797304618SKris Buschelman /*40*/ MatAXPY_SeqDense, 1808a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 1809a5ae1ecdSBarry Smith 0, 18104b0e389bSBarry Smith MatGetValues_SeqDense, 1811a5ae1ecdSBarry Smith MatCopy_SeqDense, 1812985db425SBarry Smith /*45*/ MatGetRowMax_SeqDense, 1813a5ae1ecdSBarry Smith MatScale_SeqDense, 1814a5ae1ecdSBarry Smith 0, 1815a5ae1ecdSBarry Smith 0, 1816a5ae1ecdSBarry Smith 0, 1817521d7252SBarry Smith /*50*/ 0, 1818a5ae1ecdSBarry Smith 0, 1819a5ae1ecdSBarry Smith 0, 1820a5ae1ecdSBarry Smith 0, 1821a5ae1ecdSBarry Smith 0, 182297304618SKris Buschelman /*55*/ 0, 1823a5ae1ecdSBarry Smith 0, 1824a5ae1ecdSBarry Smith 0, 1825a5ae1ecdSBarry Smith 0, 1826a5ae1ecdSBarry Smith 0, 182797304618SKris Buschelman /*60*/ 0, 1828e03a110bSBarry Smith MatDestroy_SeqDense, 1829e03a110bSBarry Smith MatView_SeqDense, 1830357abbc8SBarry Smith 0, 183197304618SKris Buschelman 0, 183297304618SKris Buschelman /*65*/ 0, 183397304618SKris Buschelman 0, 183497304618SKris Buschelman 0, 183597304618SKris Buschelman 0, 183697304618SKris Buschelman 0, 1837985db425SBarry Smith /*70*/ MatGetRowMaxAbs_SeqDense, 183897304618SKris Buschelman 0, 183997304618SKris Buschelman 0, 184097304618SKris Buschelman 0, 184197304618SKris Buschelman 0, 184297304618SKris Buschelman /*75*/ 0, 184397304618SKris Buschelman 0, 184497304618SKris Buschelman 0, 184597304618SKris Buschelman 0, 184697304618SKris Buschelman 0, 184797304618SKris Buschelman /*80*/ 0, 184897304618SKris Buschelman 0, 184997304618SKris Buschelman 0, 185097304618SKris Buschelman 0, 1851865e5f61SKris Buschelman /*84*/ MatLoad_SeqDense, 1852865e5f61SKris Buschelman 0, 18531cbb95d3SBarry Smith MatIsHermitian_SeqDense, 1854865e5f61SKris Buschelman 0, 1855865e5f61SKris Buschelman 0, 1856865e5f61SKris Buschelman 0, 1857a9fe9ddaSSatish Balay /*90*/ MatMatMult_SeqDense_SeqDense, 1858a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 1859a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 1860865e5f61SKris Buschelman 0, 1861865e5f61SKris Buschelman 0, 1862865e5f61SKris Buschelman /*95*/ 0, 1863a9fe9ddaSSatish Balay MatMatMultTranspose_SeqDense_SeqDense, 1864a9fe9ddaSSatish Balay MatMatMultTransposeSymbolic_SeqDense_SeqDense, 1865a9fe9ddaSSatish Balay MatMatMultTransposeNumeric_SeqDense_SeqDense, 1866284134d9SBarry Smith 0, 1867284134d9SBarry Smith /*100*/0, 1868284134d9SBarry Smith 0, 1869284134d9SBarry Smith 0, 1870284134d9SBarry Smith 0, 1871985db425SBarry Smith MatSetSizes_SeqDense, 1872985db425SBarry Smith 0, 1873985db425SBarry Smith 0, 1874985db425SBarry Smith 0, 1875985db425SBarry Smith 0, 1876985db425SBarry Smith 0, 1877985db425SBarry Smith /*110*/0, 1878985db425SBarry Smith 0, 18798d0534beSBarry Smith MatGetRowMin_SeqDense, 18808d0534beSBarry Smith MatGetColumnVector_SeqDense 1881985db425SBarry Smith }; 188290ace30eSBarry Smith 18834a2ae208SSatish Balay #undef __FUNCT__ 18844a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 18854b828684SBarry Smith /*@C 1886fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 1887d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 1888d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 1889289bc588SBarry Smith 1890db81eaa0SLois Curfman McInnes Collective on MPI_Comm 1891db81eaa0SLois Curfman McInnes 189220563c6bSBarry Smith Input Parameters: 1893db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 18940c775827SLois Curfman McInnes . m - number of rows 189518f449edSLois Curfman McInnes . n - number of columns 1896db81eaa0SLois Curfman McInnes - data - optional location of matrix data. Set data=PETSC_NULL for PETSc 1897dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 189820563c6bSBarry Smith 189920563c6bSBarry Smith Output Parameter: 190044cd7ae7SLois Curfman McInnes . A - the matrix 190120563c6bSBarry Smith 1902b259b22eSLois Curfman McInnes Notes: 190318f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 190418f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 1905b4fd4287SBarry Smith set data=PETSC_NULL. 190618f449edSLois Curfman McInnes 1907027ccd11SLois Curfman McInnes Level: intermediate 1908027ccd11SLois Curfman McInnes 1909dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 1910d65003e9SLois Curfman McInnes 1911db81eaa0SLois Curfman McInnes .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues() 191220563c6bSBarry Smith @*/ 1913be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 1914289bc588SBarry Smith { 1915dfbe8321SBarry Smith PetscErrorCode ierr; 19163b2fbd54SBarry Smith 19173a40ed3dSBarry Smith PetscFunctionBegin; 1918f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 1919f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 1920273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 1921273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 1922273d9f13SBarry Smith PetscFunctionReturn(0); 1923273d9f13SBarry Smith } 1924273d9f13SBarry Smith 19254a2ae208SSatish Balay #undef __FUNCT__ 1926afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 1927273d9f13SBarry Smith /*@C 1928273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 1929273d9f13SBarry Smith 1930273d9f13SBarry Smith Collective on MPI_Comm 1931273d9f13SBarry Smith 1932273d9f13SBarry Smith Input Parameters: 1933273d9f13SBarry Smith + A - the matrix 1934273d9f13SBarry Smith - data - the array (or PETSC_NULL) 1935273d9f13SBarry Smith 1936273d9f13SBarry Smith Notes: 1937273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 1938273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 1939284134d9SBarry Smith need not call this routine. 1940273d9f13SBarry Smith 1941273d9f13SBarry Smith Level: intermediate 1942273d9f13SBarry Smith 1943273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 1944273d9f13SBarry Smith 1945273d9f13SBarry Smith .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues() 1946273d9f13SBarry Smith @*/ 1947be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 1948273d9f13SBarry Smith { 1949dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(Mat,PetscScalar[]); 1950a23d5eceSKris Buschelman 1951a23d5eceSKris Buschelman PetscFunctionBegin; 1952a23d5eceSKris Buschelman ierr = PetscObjectQueryFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",(void (**)(void))&f);CHKERRQ(ierr); 1953a23d5eceSKris Buschelman if (f) { 1954a23d5eceSKris Buschelman ierr = (*f)(B,data);CHKERRQ(ierr); 1955a23d5eceSKris Buschelman } 1956a23d5eceSKris Buschelman PetscFunctionReturn(0); 1957a23d5eceSKris Buschelman } 1958a23d5eceSKris Buschelman 1959a23d5eceSKris Buschelman EXTERN_C_BEGIN 1960a23d5eceSKris Buschelman #undef __FUNCT__ 1961afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 1962be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 1963a23d5eceSKris Buschelman { 1964273d9f13SBarry Smith Mat_SeqDense *b; 1965dfbe8321SBarry Smith PetscErrorCode ierr; 1966273d9f13SBarry Smith 1967273d9f13SBarry Smith PetscFunctionBegin; 1968273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 1969273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 1970d0f46423SBarry Smith if (b->lda <= 0) b->lda = B->rmap->n; 19719e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 19729e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 19735afd5e0cSBarry Smith ierr = PetscMalloc(b->lda*b->Nmax*sizeof(PetscScalar),&b->v);CHKERRQ(ierr); 1974284134d9SBarry Smith ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 1975284134d9SBarry Smith ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 19769e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 1977273d9f13SBarry Smith } else { /* user-allocated storage */ 19789e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 1979273d9f13SBarry Smith b->v = data; 1980273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 1981273d9f13SBarry Smith } 1982273d9f13SBarry Smith PetscFunctionReturn(0); 1983273d9f13SBarry Smith } 1984a23d5eceSKris Buschelman EXTERN_C_END 1985273d9f13SBarry Smith 19861b807ce4Svictorle #undef __FUNCT__ 19871b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 19881b807ce4Svictorle /*@C 19891b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 19901b807ce4Svictorle 19911b807ce4Svictorle Input parameter: 19921b807ce4Svictorle + A - the matrix 19931b807ce4Svictorle - lda - the leading dimension 19941b807ce4Svictorle 19951b807ce4Svictorle Notes: 19961b807ce4Svictorle This routine is to be used in conjunction with MatSeqDenseSetPreallocation; 19971b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 19981b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 19991b807ce4Svictorle 20001b807ce4Svictorle Level: intermediate 20011b807ce4Svictorle 20021b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 20031b807ce4Svictorle 2004284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 20051b807ce4Svictorle @*/ 2006be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetLDA(Mat B,PetscInt lda) 20071b807ce4Svictorle { 20081b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 200921a2c019SBarry Smith 20101b807ce4Svictorle PetscFunctionBegin; 2011d0f46423SBarry Smith if (lda < B->rmap->n) SETERRQ2(PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->rmap->n); 20121b807ce4Svictorle b->lda = lda; 201321a2c019SBarry Smith b->changelda = PETSC_FALSE; 201421a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 20151b807ce4Svictorle PetscFunctionReturn(0); 20161b807ce4Svictorle } 20171b807ce4Svictorle 20180bad9183SKris Buschelman /*MC 2019fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 20200bad9183SKris Buschelman 20210bad9183SKris Buschelman Options Database Keys: 20220bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 20230bad9183SKris Buschelman 20240bad9183SKris Buschelman Level: beginner 20250bad9183SKris Buschelman 202689665df3SBarry Smith .seealso: MatCreateSeqDense() 202789665df3SBarry Smith 20280bad9183SKris Buschelman M*/ 20290bad9183SKris Buschelman 2030273d9f13SBarry Smith EXTERN_C_BEGIN 20314a2ae208SSatish Balay #undef __FUNCT__ 20324a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 2033be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreate_SeqDense(Mat B) 2034273d9f13SBarry Smith { 2035273d9f13SBarry Smith Mat_SeqDense *b; 2036dfbe8321SBarry Smith PetscErrorCode ierr; 20377c334f02SBarry Smith PetscMPIInt size; 2038273d9f13SBarry Smith 2039273d9f13SBarry Smith PetscFunctionBegin; 20407adad957SLisandro Dalcin ierr = MPI_Comm_size(((PetscObject)B)->comm,&size);CHKERRQ(ierr); 204129bbc08cSBarry Smith if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 204255659b69SBarry Smith 2043d0f46423SBarry Smith B->rmap->bs = B->cmap->bs = 1; 2044d0f46423SBarry Smith ierr = PetscMapSetUp(B->rmap);CHKERRQ(ierr); 2045d0f46423SBarry Smith ierr = PetscMapSetUp(B->cmap);CHKERRQ(ierr); 2046273d9f13SBarry Smith 204738f2d2fdSLisandro Dalcin ierr = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr); 2048549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 204990f02eecSBarry Smith B->mapping = 0; 205044cd7ae7SLois Curfman McInnes B->data = (void*)b; 205118f449edSLois Curfman McInnes 2052a5ae1ecdSBarry Smith 205344cd7ae7SLois Curfman McInnes b->pivots = 0; 2054273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2055273d9f13SBarry Smith b->v = 0; 2056d0f46423SBarry Smith b->lda = B->rmap->n; 205721a2c019SBarry Smith b->changelda = PETSC_FALSE; 2058d0f46423SBarry Smith b->Mmax = B->rmap->n; 2059d0f46423SBarry Smith b->Nmax = B->cmap->n; 20604e220ebcSLois Curfman McInnes 2061b24902e0SBarry Smith 2062b24902e0SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_seqdense_petsc_C", 2063b24902e0SBarry Smith "MatGetFactor_seqdense_petsc", 2064b24902e0SBarry Smith MatGetFactor_seqdense_petsc);CHKERRQ(ierr); 2065a23d5eceSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C", 2066a23d5eceSKris Buschelman "MatSeqDenseSetPreallocation_SeqDense", 2067a23d5eceSKris Buschelman MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 20684ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqaij_seqdense_C", 20694ae313f4SHong Zhang "MatMatMult_SeqAIJ_SeqDense", 20704ae313f4SHong Zhang MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 20714ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C", 20724ae313f4SHong Zhang "MatMatMultSymbolic_SeqAIJ_SeqDense", 20734ae313f4SHong Zhang MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 20744ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C", 20754ae313f4SHong Zhang "MatMatMultNumeric_SeqAIJ_SeqDense", 20764ae313f4SHong Zhang MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 207717667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 20783a40ed3dSBarry Smith PetscFunctionReturn(0); 2079289bc588SBarry Smith } 2080c0aa2d19SHong Zhang 2081c0aa2d19SHong Zhang 2082273d9f13SBarry Smith EXTERN_C_END 2083