1be1d678aSKris Buschelman 267e560aaSBarry Smith /* 367e560aaSBarry Smith Defines the basic matrix operations for sequential dense. 467e560aaSBarry Smith */ 5289bc588SBarry Smith 6*c6db04a5SJed Brown #include <../src/mat/impls/dense/seq/dense.h> 7*c6db04a5SJed Brown #include <petscblaslapack.h> 8289bc588SBarry Smith 94a2ae208SSatish Balay #undef __FUNCT__ 104a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense" 11f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 121987afe7SBarry Smith { 131987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 14f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 1513f74950SBarry Smith PetscInt j; 160805154bSBarry Smith PetscBLASInt N,m,ldax,lday,one = 1; 17efee365bSSatish Balay PetscErrorCode ierr; 183a40ed3dSBarry Smith 193a40ed3dSBarry Smith PetscFunctionBegin; 20d0f46423SBarry Smith N = PetscBLASIntCast(X->rmap->n*X->cmap->n); 21d0f46423SBarry Smith m = PetscBLASIntCast(X->rmap->n); 220805154bSBarry Smith ldax = PetscBLASIntCast(x->lda); 230805154bSBarry Smith lday = PetscBLASIntCast(y->lda); 24a5ce6ee0Svictorle if (ldax>m || lday>m) { 25d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 26f4df32b1SMatthew Knepley BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one); 27a5ce6ee0Svictorle } 28a5ce6ee0Svictorle } else { 29f4df32b1SMatthew Knepley BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one); 30a5ce6ee0Svictorle } 310450473dSBarry Smith ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr); 323a40ed3dSBarry Smith PetscFunctionReturn(0); 331987afe7SBarry Smith } 341987afe7SBarry Smith 354a2ae208SSatish Balay #undef __FUNCT__ 364a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense" 37dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 38289bc588SBarry Smith { 39d0f46423SBarry Smith PetscInt N = A->rmap->n*A->cmap->n; 403a40ed3dSBarry Smith 413a40ed3dSBarry Smith PetscFunctionBegin; 424e220ebcSLois Curfman McInnes info->block_size = 1.0; 434e220ebcSLois Curfman McInnes info->nz_allocated = (double)N; 446de62eeeSBarry Smith info->nz_used = (double)N; 456de62eeeSBarry Smith info->nz_unneeded = (double)0; 464e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 474e220ebcSLois Curfman McInnes info->mallocs = 0; 487adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 494e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 504e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 514e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 523a40ed3dSBarry Smith PetscFunctionReturn(0); 53289bc588SBarry Smith } 54289bc588SBarry Smith 554a2ae208SSatish Balay #undef __FUNCT__ 564a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense" 57f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 5880cd9d93SLois Curfman McInnes { 59273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 60f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 61efee365bSSatish Balay PetscErrorCode ierr; 620805154bSBarry Smith PetscBLASInt one = 1,j,nz,lda = PetscBLASIntCast(a->lda); 6380cd9d93SLois Curfman McInnes 643a40ed3dSBarry Smith PetscFunctionBegin; 65d0f46423SBarry Smith if (lda>A->rmap->n) { 66d0f46423SBarry Smith nz = PetscBLASIntCast(A->rmap->n); 67d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 68f4df32b1SMatthew Knepley BLASscal_(&nz,&oalpha,a->v+j*lda,&one); 69a5ce6ee0Svictorle } 70a5ce6ee0Svictorle } else { 71d0f46423SBarry Smith nz = PetscBLASIntCast(A->rmap->n*A->cmap->n); 72f4df32b1SMatthew Knepley BLASscal_(&nz,&oalpha,a->v,&one); 73a5ce6ee0Svictorle } 74efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 753a40ed3dSBarry Smith PetscFunctionReturn(0); 7680cd9d93SLois Curfman McInnes } 7780cd9d93SLois Curfman McInnes 781cbb95d3SBarry Smith #undef __FUNCT__ 791cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense" 80ace3abfcSBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 811cbb95d3SBarry Smith { 821cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 83d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,N; 841cbb95d3SBarry Smith PetscScalar *v = a->v; 851cbb95d3SBarry Smith 861cbb95d3SBarry Smith PetscFunctionBegin; 871cbb95d3SBarry Smith *fl = PETSC_FALSE; 88d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 891cbb95d3SBarry Smith N = a->lda; 901cbb95d3SBarry Smith 911cbb95d3SBarry Smith for (i=0; i<m; i++) { 921cbb95d3SBarry Smith for (j=i+1; j<m; j++) { 931cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 941cbb95d3SBarry Smith } 951cbb95d3SBarry Smith } 961cbb95d3SBarry Smith *fl = PETSC_TRUE; 971cbb95d3SBarry Smith PetscFunctionReturn(0); 981cbb95d3SBarry Smith } 991cbb95d3SBarry Smith 100b24902e0SBarry Smith #undef __FUNCT__ 101b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense" 102719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 103b24902e0SBarry Smith { 104b24902e0SBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 105b24902e0SBarry Smith PetscErrorCode ierr; 106b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 107b24902e0SBarry Smith 108b24902e0SBarry Smith PetscFunctionBegin; 109719d5645SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,PETSC_NULL);CHKERRQ(ierr); 110b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 111b24902e0SBarry Smith l = (Mat_SeqDense*)newi->data; 112d0f46423SBarry Smith if (lda>A->rmap->n) { 113d0f46423SBarry Smith m = A->rmap->n; 114d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 115b24902e0SBarry Smith ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 116b24902e0SBarry Smith } 117b24902e0SBarry Smith } else { 118d0f46423SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 119b24902e0SBarry Smith } 120b24902e0SBarry Smith } 121b24902e0SBarry Smith newi->assembled = PETSC_TRUE; 122b24902e0SBarry Smith PetscFunctionReturn(0); 123b24902e0SBarry Smith } 124b24902e0SBarry Smith 1254a2ae208SSatish Balay #undef __FUNCT__ 1264a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense" 127dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 12802cad45dSBarry Smith { 1296849ba73SBarry Smith PetscErrorCode ierr; 13002cad45dSBarry Smith 1313a40ed3dSBarry Smith PetscFunctionBegin; 1325c9eb25fSBarry Smith ierr = MatCreate(((PetscObject)A)->comm,newmat);CHKERRQ(ierr); 133d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1345c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 135719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 136b24902e0SBarry Smith PetscFunctionReturn(0); 137b24902e0SBarry Smith } 138b24902e0SBarry Smith 1396ee01492SSatish Balay 1400481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*); 141719d5645SBarry Smith 1424a2ae208SSatish Balay #undef __FUNCT__ 1434a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense" 1440481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 145289bc588SBarry Smith { 1464482741eSBarry Smith MatFactorInfo info; 147a093e273SMatthew Knepley PetscErrorCode ierr; 1483a40ed3dSBarry Smith 1493a40ed3dSBarry Smith PetscFunctionBegin; 150c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 151719d5645SBarry Smith ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr); 1523a40ed3dSBarry Smith PetscFunctionReturn(0); 153289bc588SBarry Smith } 1546ee01492SSatish Balay 1550b4b3355SBarry Smith #undef __FUNCT__ 1564a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense" 157dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 158289bc588SBarry Smith { 159c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1606849ba73SBarry Smith PetscErrorCode ierr; 16187828ca2SBarry Smith PetscScalar *x,*y; 162d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 16367e560aaSBarry Smith 1643a40ed3dSBarry Smith PetscFunctionBegin; 1651ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 1661ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 167d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 168d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 169ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 170e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 171ae7cfcebSSatish Balay #else 17271044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 173e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 174ae7cfcebSSatish Balay #endif 175d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY){ 176ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 177e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 178ae7cfcebSSatish Balay #else 17971044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 180e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 181ae7cfcebSSatish Balay #endif 182289bc588SBarry Smith } 183e32f2f54SBarry Smith else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 1841ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 1851ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 186dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 1873a40ed3dSBarry Smith PetscFunctionReturn(0); 188289bc588SBarry Smith } 1896ee01492SSatish Balay 1904a2ae208SSatish Balay #undef __FUNCT__ 19185e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense" 19285e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 19385e2c93fSHong Zhang { 19485e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 19585e2c93fSHong Zhang PetscErrorCode ierr; 19685e2c93fSHong Zhang PetscScalar *b,*x; 19785e2c93fSHong Zhang PetscBLASInt nrhs,info,m=PetscBLASIntCast(A->rmap->n); 19885e2c93fSHong Zhang 19985e2c93fSHong Zhang PetscFunctionBegin; 20085e2c93fSHong Zhang ierr = MatGetSize(B,PETSC_NULL,&nrhs);CHKERRQ(ierr); 20185e2c93fSHong Zhang ierr = MatGetArray(B,&b);CHKERRQ(ierr); 20285e2c93fSHong Zhang ierr = MatGetArray(X,&x);CHKERRQ(ierr); 20385e2c93fSHong Zhang 20485e2c93fSHong Zhang ierr = PetscMemcpy(x,b,m*sizeof(PetscScalar));CHKERRQ(ierr); 20585e2c93fSHong Zhang 20685e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 20785e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS) 20885e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 20985e2c93fSHong Zhang #else 21085e2c93fSHong Zhang LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info); 21185e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 21285e2c93fSHong Zhang #endif 21385e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY){ 21485e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS) 21585e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 21685e2c93fSHong Zhang #else 21785e2c93fSHong Zhang LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info); 21885e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 21985e2c93fSHong Zhang #endif 22085e2c93fSHong Zhang } 22185e2c93fSHong Zhang else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 22285e2c93fSHong Zhang 22385e2c93fSHong Zhang ierr = MatRestoreArray(B,&b);CHKERRQ(ierr); 22485e2c93fSHong Zhang ierr = MatRestoreArray(X,&x);CHKERRQ(ierr); 22585e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m- m));CHKERRQ(ierr); 22685e2c93fSHong Zhang PetscFunctionReturn(0); 22785e2c93fSHong Zhang } 22885e2c93fSHong Zhang 22985e2c93fSHong Zhang #undef __FUNCT__ 2304a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense" 231dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 232da3a660dSBarry Smith { 233c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 234dfbe8321SBarry Smith PetscErrorCode ierr; 23587828ca2SBarry Smith PetscScalar *x,*y; 236d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 23767e560aaSBarry Smith 2383a40ed3dSBarry Smith PetscFunctionBegin; 2391ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2401ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 241d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 242752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 243da3a660dSBarry Smith if (mat->pivots) { 244ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 245e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 246ae7cfcebSSatish Balay #else 24771044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 248e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 249ae7cfcebSSatish Balay #endif 2507a97a34bSBarry Smith } else { 251ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 252e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 253ae7cfcebSSatish Balay #else 25471044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 255e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 256ae7cfcebSSatish Balay #endif 257da3a660dSBarry Smith } 2581ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2591ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 260dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 2613a40ed3dSBarry Smith PetscFunctionReturn(0); 262da3a660dSBarry Smith } 2636ee01492SSatish Balay 2644a2ae208SSatish Balay #undef __FUNCT__ 2654a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense" 266dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 267da3a660dSBarry Smith { 268c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 269dfbe8321SBarry Smith PetscErrorCode ierr; 27087828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 271da3a660dSBarry Smith Vec tmp = 0; 272d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 27367e560aaSBarry Smith 2743a40ed3dSBarry Smith PetscFunctionBegin; 2751ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2761ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 277d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 278da3a660dSBarry Smith if (yy == zz) { 27978b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 28052e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 28178b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 282da3a660dSBarry Smith } 283d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 284752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 285da3a660dSBarry Smith if (mat->pivots) { 286ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 287e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 288ae7cfcebSSatish Balay #else 28971044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 290e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 291ae7cfcebSSatish Balay #endif 292a8c6a408SBarry Smith } else { 293ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 294e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 295ae7cfcebSSatish Balay #else 29671044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 297e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 298ae7cfcebSSatish Balay #endif 299da3a660dSBarry Smith } 3002dcb1b2aSMatthew Knepley if (tmp) {ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); ierr = VecDestroy(tmp);CHKERRQ(ierr);} 3012dcb1b2aSMatthew Knepley else {ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);} 3021ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3031ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 304dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 3053a40ed3dSBarry Smith PetscFunctionReturn(0); 306da3a660dSBarry Smith } 30767e560aaSBarry Smith 3084a2ae208SSatish Balay #undef __FUNCT__ 3094a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense" 310dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 311da3a660dSBarry Smith { 312c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 3136849ba73SBarry Smith PetscErrorCode ierr; 31487828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 315da3a660dSBarry Smith Vec tmp; 316d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 31767e560aaSBarry Smith 3183a40ed3dSBarry Smith PetscFunctionBegin; 319d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 3201ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 3211ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 322da3a660dSBarry Smith if (yy == zz) { 32378b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 32452e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 32578b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 326da3a660dSBarry Smith } 327d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 328752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 329da3a660dSBarry Smith if (mat->pivots) { 330ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 331e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 332ae7cfcebSSatish Balay #else 33371044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 334e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 335ae7cfcebSSatish Balay #endif 3363a40ed3dSBarry Smith } else { 337ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 338e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 339ae7cfcebSSatish Balay #else 34071044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 341e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 342ae7cfcebSSatish Balay #endif 343da3a660dSBarry Smith } 34490f02eecSBarry Smith if (tmp) { 3452dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 34690f02eecSBarry Smith ierr = VecDestroy(tmp);CHKERRQ(ierr); 3473a40ed3dSBarry Smith } else { 3482dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 34990f02eecSBarry Smith } 3501ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3511ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 352dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 3533a40ed3dSBarry Smith PetscFunctionReturn(0); 354da3a660dSBarry Smith } 355db4efbfdSBarry Smith 356db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 357db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 358db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 359db4efbfdSBarry Smith #undef __FUNCT__ 360db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense" 3610481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 362db4efbfdSBarry Smith { 363db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 364db4efbfdSBarry Smith PetscFunctionBegin; 365e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 366db4efbfdSBarry Smith #else 367db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 368db4efbfdSBarry Smith PetscErrorCode ierr; 369db4efbfdSBarry Smith PetscBLASInt n,m,info; 370db4efbfdSBarry Smith 371db4efbfdSBarry Smith PetscFunctionBegin; 372db4efbfdSBarry Smith n = PetscBLASIntCast(A->cmap->n); 373db4efbfdSBarry Smith m = PetscBLASIntCast(A->rmap->n); 374db4efbfdSBarry Smith if (!mat->pivots) { 375db4efbfdSBarry Smith ierr = PetscMalloc((A->rmap->n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr); 376db4efbfdSBarry Smith ierr = PetscLogObjectMemory(A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 377db4efbfdSBarry Smith } 378db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 379db4efbfdSBarry Smith LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info); 380e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 381e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 382db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 383db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 384db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 385db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 386d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 387db4efbfdSBarry Smith 388dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 389db4efbfdSBarry Smith #endif 390db4efbfdSBarry Smith PetscFunctionReturn(0); 391db4efbfdSBarry Smith } 392db4efbfdSBarry Smith 393db4efbfdSBarry Smith #undef __FUNCT__ 394db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense" 3950481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 396db4efbfdSBarry Smith { 397db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 398db4efbfdSBarry Smith PetscFunctionBegin; 399e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 400db4efbfdSBarry Smith #else 401db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 402db4efbfdSBarry Smith PetscErrorCode ierr; 403db4efbfdSBarry Smith PetscBLASInt info,n = PetscBLASIntCast(A->cmap->n); 404db4efbfdSBarry Smith 405db4efbfdSBarry Smith PetscFunctionBegin; 406db4efbfdSBarry Smith ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 407db4efbfdSBarry Smith 408db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 409db4efbfdSBarry Smith LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info); 410e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 411db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 412db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 413db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 414db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 415d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 416dc0b31edSSatish Balay ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 417db4efbfdSBarry Smith #endif 418db4efbfdSBarry Smith PetscFunctionReturn(0); 419db4efbfdSBarry Smith } 420db4efbfdSBarry Smith 421db4efbfdSBarry Smith 422db4efbfdSBarry Smith #undef __FUNCT__ 423db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense" 4240481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 425db4efbfdSBarry Smith { 426db4efbfdSBarry Smith PetscErrorCode ierr; 427db4efbfdSBarry Smith MatFactorInfo info; 428db4efbfdSBarry Smith 429db4efbfdSBarry Smith PetscFunctionBegin; 430db4efbfdSBarry Smith info.fill = 1.0; 431c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 432719d5645SBarry Smith ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr); 433db4efbfdSBarry Smith PetscFunctionReturn(0); 434db4efbfdSBarry Smith } 435db4efbfdSBarry Smith 436db4efbfdSBarry Smith #undef __FUNCT__ 437db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense" 4380481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 439db4efbfdSBarry Smith { 440db4efbfdSBarry Smith PetscFunctionBegin; 441c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 442719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 443db4efbfdSBarry Smith PetscFunctionReturn(0); 444db4efbfdSBarry Smith } 445db4efbfdSBarry Smith 446db4efbfdSBarry Smith #undef __FUNCT__ 447db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense" 4480481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 449db4efbfdSBarry Smith { 450db4efbfdSBarry Smith PetscFunctionBegin; 451c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 452719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 453db4efbfdSBarry Smith PetscFunctionReturn(0); 454db4efbfdSBarry Smith } 455db4efbfdSBarry Smith 456bb5747d9SMatthew Knepley EXTERN_C_BEGIN 457db4efbfdSBarry Smith #undef __FUNCT__ 458db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc" 459db4efbfdSBarry Smith PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 460db4efbfdSBarry Smith { 461db4efbfdSBarry Smith PetscErrorCode ierr; 462db4efbfdSBarry Smith 463db4efbfdSBarry Smith PetscFunctionBegin; 464db4efbfdSBarry Smith ierr = MatCreate(((PetscObject)A)->comm,fact);CHKERRQ(ierr); 465db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 466db4efbfdSBarry Smith ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr); 467db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU){ 468db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 469db4efbfdSBarry Smith } else { 470db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 471db4efbfdSBarry Smith } 472d5f3da31SBarry Smith (*fact)->factortype = ftype; 473db4efbfdSBarry Smith PetscFunctionReturn(0); 474db4efbfdSBarry Smith } 475bb5747d9SMatthew Knepley EXTERN_C_END 476db4efbfdSBarry Smith 477289bc588SBarry Smith /* ------------------------------------------------------------------*/ 4784a2ae208SSatish Balay #undef __FUNCT__ 47941f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense" 48041f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 481289bc588SBarry Smith { 482c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 48387828ca2SBarry Smith PetscScalar *x,*b,*v = mat->v,zero = 0.0,xt; 484dfbe8321SBarry Smith PetscErrorCode ierr; 485d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 486aa482453SBarry Smith #if !defined(PETSC_USE_COMPLEX) 4870805154bSBarry Smith PetscBLASInt o = 1,bm = PetscBLASIntCast(m); 488bc1b551cSSatish Balay #endif 489289bc588SBarry Smith 4903a40ed3dSBarry Smith PetscFunctionBegin; 491289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 49271044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 4932dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 494289bc588SBarry Smith } 4951ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 4961ebc52fbSHong Zhang ierr = VecGetArray(bb,&b);CHKERRQ(ierr); 497b965ef7fSBarry Smith its = its*lits; 498e32f2f54SBarry Smith if (its <= 0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits); 499289bc588SBarry Smith while (its--) { 500fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){ 501289bc588SBarry Smith for (i=0; i<m; i++) { 502aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 503f1747703SBarry Smith /* cannot use BLAS dot for complex because compiler/linker is 504f1747703SBarry Smith not happy about returning a double complex */ 50513f74950SBarry Smith PetscInt _i; 50687828ca2SBarry Smith PetscScalar sum = b[i]; 507f1747703SBarry Smith for (_i=0; _i<m; _i++) { 5083f6de6efSSatish Balay sum -= PetscConj(v[i+_i*m])*x[_i]; 509f1747703SBarry Smith } 510f1747703SBarry Smith xt = sum; 511f1747703SBarry Smith #else 51271044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 513f1747703SBarry Smith #endif 51455a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 515289bc588SBarry Smith } 516289bc588SBarry Smith } 517fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){ 518289bc588SBarry Smith for (i=m-1; i>=0; i--) { 519aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 520f1747703SBarry Smith /* cannot use BLAS dot for complex because compiler/linker is 521f1747703SBarry Smith not happy about returning a double complex */ 52213f74950SBarry Smith PetscInt _i; 52387828ca2SBarry Smith PetscScalar sum = b[i]; 524f1747703SBarry Smith for (_i=0; _i<m; _i++) { 5253f6de6efSSatish Balay sum -= PetscConj(v[i+_i*m])*x[_i]; 526f1747703SBarry Smith } 527f1747703SBarry Smith xt = sum; 528f1747703SBarry Smith #else 52971044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 530f1747703SBarry Smith #endif 53155a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 532289bc588SBarry Smith } 533289bc588SBarry Smith } 534289bc588SBarry Smith } 5351ebc52fbSHong Zhang ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr); 5361ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5373a40ed3dSBarry Smith PetscFunctionReturn(0); 538289bc588SBarry Smith } 539289bc588SBarry Smith 540289bc588SBarry Smith /* -----------------------------------------------------------------*/ 5414a2ae208SSatish Balay #undef __FUNCT__ 5424a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense" 543dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 544289bc588SBarry Smith { 545c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 54687828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 547dfbe8321SBarry Smith PetscErrorCode ierr; 5480805154bSBarry Smith PetscBLASInt m, n,_One=1; 549ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 5503a40ed3dSBarry Smith 5513a40ed3dSBarry Smith PetscFunctionBegin; 552d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 553d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 554d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5551ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5561ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 55771044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One); 5581ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5591ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 560dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 5613a40ed3dSBarry Smith PetscFunctionReturn(0); 562289bc588SBarry Smith } 563800995b7SMatthew Knepley 5644a2ae208SSatish Balay #undef __FUNCT__ 5654a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense" 566dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 567289bc588SBarry Smith { 568c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 56987828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0; 570dfbe8321SBarry Smith PetscErrorCode ierr; 5710805154bSBarry Smith PetscBLASInt m, n, _One=1; 5723a40ed3dSBarry Smith 5733a40ed3dSBarry Smith PetscFunctionBegin; 574d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 575d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 576d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5771ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5781ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 57971044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One); 5801ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5811ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 582dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 5833a40ed3dSBarry Smith PetscFunctionReturn(0); 584289bc588SBarry Smith } 5856ee01492SSatish Balay 5864a2ae208SSatish Balay #undef __FUNCT__ 5874a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense" 588dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 589289bc588SBarry Smith { 590c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 59187828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0; 592dfbe8321SBarry Smith PetscErrorCode ierr; 5930805154bSBarry Smith PetscBLASInt m, n, _One=1; 5943a40ed3dSBarry Smith 5953a40ed3dSBarry Smith PetscFunctionBegin; 596d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 597d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 598d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 599600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 6001ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 6011ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 60271044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 6031ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6041ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 605dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 6063a40ed3dSBarry Smith PetscFunctionReturn(0); 607289bc588SBarry Smith } 6086ee01492SSatish Balay 6094a2ae208SSatish Balay #undef __FUNCT__ 6104a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense" 611dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 612289bc588SBarry Smith { 613c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 61487828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 615dfbe8321SBarry Smith PetscErrorCode ierr; 6160805154bSBarry Smith PetscBLASInt m, n, _One=1; 61787828ca2SBarry Smith PetscScalar _DOne=1.0; 6183a40ed3dSBarry Smith 6193a40ed3dSBarry Smith PetscFunctionBegin; 620d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 621d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 622d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 623600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 6241ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 6251ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 62671044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 6271ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6281ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 629dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 6303a40ed3dSBarry Smith PetscFunctionReturn(0); 631289bc588SBarry Smith } 632289bc588SBarry Smith 633289bc588SBarry Smith /* -----------------------------------------------------------------*/ 6344a2ae208SSatish Balay #undef __FUNCT__ 6354a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense" 63613f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 637289bc588SBarry Smith { 638c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 63987828ca2SBarry Smith PetscScalar *v; 6406849ba73SBarry Smith PetscErrorCode ierr; 64113f74950SBarry Smith PetscInt i; 64267e560aaSBarry Smith 6433a40ed3dSBarry Smith PetscFunctionBegin; 644d0f46423SBarry Smith *ncols = A->cmap->n; 645289bc588SBarry Smith if (cols) { 646d0f46423SBarry Smith ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr); 647d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 648289bc588SBarry Smith } 649289bc588SBarry Smith if (vals) { 650d0f46423SBarry Smith ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr); 651289bc588SBarry Smith v = mat->v + row; 652d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 653289bc588SBarry Smith } 6543a40ed3dSBarry Smith PetscFunctionReturn(0); 655289bc588SBarry Smith } 6566ee01492SSatish Balay 6574a2ae208SSatish Balay #undef __FUNCT__ 6584a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense" 65913f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 660289bc588SBarry Smith { 661dfbe8321SBarry Smith PetscErrorCode ierr; 662606d414cSSatish Balay PetscFunctionBegin; 663606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 664606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 6653a40ed3dSBarry Smith PetscFunctionReturn(0); 666289bc588SBarry Smith } 667289bc588SBarry Smith /* ----------------------------------------------------------------*/ 6684a2ae208SSatish Balay #undef __FUNCT__ 6694a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense" 67013f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 671289bc588SBarry Smith { 672c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 67313f74950SBarry Smith PetscInt i,j,idx=0; 674d6dfbf8fSBarry Smith 6753a40ed3dSBarry Smith PetscFunctionBegin; 67671fd2e92SBarry Smith if (v) PetscValidScalarPointer(v,6); 677289bc588SBarry Smith if (!mat->roworiented) { 678dbb450caSBarry Smith if (addv == INSERT_VALUES) { 679289bc588SBarry Smith for (j=0; j<n; j++) { 680cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 6812515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 682e32f2f54SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 68358804f6dSBarry Smith #endif 684289bc588SBarry Smith for (i=0; i<m; i++) { 685cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 6862515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 687e32f2f54SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 68858804f6dSBarry Smith #endif 689cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 690289bc588SBarry Smith } 691289bc588SBarry Smith } 6923a40ed3dSBarry Smith } else { 693289bc588SBarry Smith for (j=0; j<n; j++) { 694cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 6952515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 696e32f2f54SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 69758804f6dSBarry Smith #endif 698289bc588SBarry Smith for (i=0; i<m; i++) { 699cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 7002515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 701e32f2f54SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 70258804f6dSBarry Smith #endif 703cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 704289bc588SBarry Smith } 705289bc588SBarry Smith } 706289bc588SBarry Smith } 7073a40ed3dSBarry Smith } else { 708dbb450caSBarry Smith if (addv == INSERT_VALUES) { 709e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 710cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 7112515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 712e32f2f54SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 71358804f6dSBarry Smith #endif 714e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 715cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 7162515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 717e32f2f54SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 71858804f6dSBarry Smith #endif 719cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 720e8d4e0b9SBarry Smith } 721e8d4e0b9SBarry Smith } 7223a40ed3dSBarry Smith } else { 723289bc588SBarry Smith for (i=0; i<m; i++) { 724cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 7252515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 726e32f2f54SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 72758804f6dSBarry Smith #endif 728289bc588SBarry Smith for (j=0; j<n; j++) { 729cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 7302515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 731e32f2f54SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1); 73258804f6dSBarry Smith #endif 733cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 734289bc588SBarry Smith } 735289bc588SBarry Smith } 736289bc588SBarry Smith } 737e8d4e0b9SBarry Smith } 7383a40ed3dSBarry Smith PetscFunctionReturn(0); 739289bc588SBarry Smith } 740e8d4e0b9SBarry Smith 7414a2ae208SSatish Balay #undef __FUNCT__ 7424a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense" 74313f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 744ae80bb75SLois Curfman McInnes { 745ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 74613f74950SBarry Smith PetscInt i,j; 747ae80bb75SLois Curfman McInnes 7483a40ed3dSBarry Smith PetscFunctionBegin; 749ae80bb75SLois Curfman McInnes /* row-oriented output */ 750ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 75197e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 752e32f2f54SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested larger than number rows %D",indexm[i],A->rmap->n); 753ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 7546f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 755e32f2f54SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column %D requested larger than number columns %D",indexn[j],A->cmap->n); 75697e567efSBarry Smith *v++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 757ae80bb75SLois Curfman McInnes } 758ae80bb75SLois Curfman McInnes } 7593a40ed3dSBarry Smith PetscFunctionReturn(0); 760ae80bb75SLois Curfman McInnes } 761ae80bb75SLois Curfman McInnes 762289bc588SBarry Smith /* -----------------------------------------------------------------*/ 763289bc588SBarry Smith 7644a2ae208SSatish Balay #undef __FUNCT__ 7655bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense" 766112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer) 767aabbc4fbSShri Abhyankar { 768aabbc4fbSShri Abhyankar Mat_SeqDense *a; 769aabbc4fbSShri Abhyankar PetscErrorCode ierr; 770aabbc4fbSShri Abhyankar PetscInt *scols,i,j,nz,header[4]; 771aabbc4fbSShri Abhyankar int fd; 772aabbc4fbSShri Abhyankar PetscMPIInt size; 773aabbc4fbSShri Abhyankar PetscInt *rowlengths = 0,M,N,*cols,grows,gcols; 774aabbc4fbSShri Abhyankar PetscScalar *vals,*svals,*v,*w; 775aabbc4fbSShri Abhyankar MPI_Comm comm = ((PetscObject)viewer)->comm; 776aabbc4fbSShri Abhyankar 777aabbc4fbSShri Abhyankar PetscFunctionBegin; 778aabbc4fbSShri Abhyankar ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 779aabbc4fbSShri Abhyankar if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor"); 780aabbc4fbSShri Abhyankar ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 781aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 782aabbc4fbSShri Abhyankar if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 783aabbc4fbSShri Abhyankar M = header[1]; N = header[2]; nz = header[3]; 784aabbc4fbSShri Abhyankar 785aabbc4fbSShri Abhyankar /* set global size if not set already*/ 786aabbc4fbSShri Abhyankar if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) { 787aabbc4fbSShri Abhyankar ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr); 788aabbc4fbSShri Abhyankar } else { 789aabbc4fbSShri Abhyankar /* if sizes and type are already set, check if the vector global sizes are correct */ 790aabbc4fbSShri Abhyankar ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr); 791aabbc4fbSShri Abhyankar if (M != grows || N != gcols) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED, "Matrix in file of different length (%d, %d) than the input matrix (%d, %d)",M,N,grows,gcols); 792aabbc4fbSShri Abhyankar } 793aabbc4fbSShri Abhyankar ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr); 794aabbc4fbSShri Abhyankar 795aabbc4fbSShri Abhyankar if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 796aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 797aabbc4fbSShri Abhyankar v = a->v; 798aabbc4fbSShri Abhyankar /* Allocate some temp space to read in the values and then flip them 799aabbc4fbSShri Abhyankar from row major to column major */ 800aabbc4fbSShri Abhyankar ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr); 801aabbc4fbSShri Abhyankar /* read in nonzero values */ 802aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 803aabbc4fbSShri Abhyankar /* now flip the values and store them in the matrix*/ 804aabbc4fbSShri Abhyankar for (j=0; j<N; j++) { 805aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 806aabbc4fbSShri Abhyankar *v++ =w[i*N+j]; 807aabbc4fbSShri Abhyankar } 808aabbc4fbSShri Abhyankar } 809aabbc4fbSShri Abhyankar ierr = PetscFree(w);CHKERRQ(ierr); 810aabbc4fbSShri Abhyankar } else { 811aabbc4fbSShri Abhyankar /* read row lengths */ 812aabbc4fbSShri Abhyankar ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr); 813aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 814aabbc4fbSShri Abhyankar 815aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 816aabbc4fbSShri Abhyankar v = a->v; 817aabbc4fbSShri Abhyankar 818aabbc4fbSShri Abhyankar /* read column indices and nonzeros */ 819aabbc4fbSShri Abhyankar ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr); 820aabbc4fbSShri Abhyankar cols = scols; 821aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 822aabbc4fbSShri Abhyankar ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr); 823aabbc4fbSShri Abhyankar vals = svals; 824aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 825aabbc4fbSShri Abhyankar 826aabbc4fbSShri Abhyankar /* insert into matrix */ 827aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 828aabbc4fbSShri Abhyankar for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 829aabbc4fbSShri Abhyankar svals += rowlengths[i]; scols += rowlengths[i]; 830aabbc4fbSShri Abhyankar } 831aabbc4fbSShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 832aabbc4fbSShri Abhyankar ierr = PetscFree(cols);CHKERRQ(ierr); 833aabbc4fbSShri Abhyankar ierr = PetscFree(rowlengths);CHKERRQ(ierr); 834aabbc4fbSShri Abhyankar } 835aabbc4fbSShri Abhyankar ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 836aabbc4fbSShri Abhyankar ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 837aabbc4fbSShri Abhyankar 838aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 839aabbc4fbSShri Abhyankar } 840aabbc4fbSShri Abhyankar 841aabbc4fbSShri Abhyankar #undef __FUNCT__ 8424a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII" 8436849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 844289bc588SBarry Smith { 845932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 846dfbe8321SBarry Smith PetscErrorCode ierr; 84713f74950SBarry Smith PetscInt i,j; 8482dcb1b2aSMatthew Knepley const char *name; 84987828ca2SBarry Smith PetscScalar *v; 850f3ef73ceSBarry Smith PetscViewerFormat format; 8515f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 852ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 8535f481a85SSatish Balay #endif 854932b0c3eSLois Curfman McInnes 8553a40ed3dSBarry Smith PetscFunctionBegin; 856b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 857456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 8583a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 859fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 860d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 8617566de4bSShri Abhyankar ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr); 862d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 86344cd7ae7SLois Curfman McInnes v = a->v + i; 86477431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 865d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 866aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 867329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 868a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 869329f5518SBarry Smith } else if (PetscRealPart(*v)) { 870a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr); 8716831982aSBarry Smith } 87280cd9d93SLois Curfman McInnes #else 8736831982aSBarry Smith if (*v) { 874a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr); 8756831982aSBarry Smith } 87680cd9d93SLois Curfman McInnes #endif 8771b807ce4Svictorle v += a->lda; 87880cd9d93SLois Curfman McInnes } 879b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 88080cd9d93SLois Curfman McInnes } 881d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 8823a40ed3dSBarry Smith } else { 883d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 884aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 88547989497SBarry Smith /* determine if matrix has all real values */ 88647989497SBarry Smith v = a->v; 887d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 888ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;} 88947989497SBarry Smith } 89047989497SBarry Smith #endif 891fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 8923a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 893d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 894d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 895fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 8967566de4bSShri Abhyankar } else { 8977566de4bSShri Abhyankar ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr); 898ffac6cdbSBarry Smith } 899ffac6cdbSBarry Smith 900d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 901932b0c3eSLois Curfman McInnes v = a->v + i; 902d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 903aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 90447989497SBarry Smith if (allreal) { 905f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",PetscRealPart(*v));CHKERRQ(ierr); 90647989497SBarry Smith } else { 907f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16e i ",PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 90847989497SBarry Smith } 909289bc588SBarry Smith #else 910f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",*v);CHKERRQ(ierr); 911289bc588SBarry Smith #endif 9121b807ce4Svictorle v += a->lda; 913289bc588SBarry Smith } 914b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 915289bc588SBarry Smith } 916fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 917b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 918ffac6cdbSBarry Smith } 919d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 920da3a660dSBarry Smith } 921b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 9223a40ed3dSBarry Smith PetscFunctionReturn(0); 923289bc588SBarry Smith } 924289bc588SBarry Smith 9254a2ae208SSatish Balay #undef __FUNCT__ 9264a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary" 9276849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 928932b0c3eSLois Curfman McInnes { 929932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 9306849ba73SBarry Smith PetscErrorCode ierr; 93113f74950SBarry Smith int fd; 932d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 933f4403165SShri Abhyankar PetscScalar *v,*anonz,*vals; 934f4403165SShri Abhyankar PetscViewerFormat format; 935932b0c3eSLois Curfman McInnes 9363a40ed3dSBarry Smith PetscFunctionBegin; 937b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 93890ace30eSBarry Smith 939f4403165SShri Abhyankar ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 940f4403165SShri Abhyankar if (format == PETSC_VIEWER_NATIVE) { 941f4403165SShri Abhyankar /* store the matrix as a dense matrix */ 942f4403165SShri Abhyankar ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 943f4403165SShri Abhyankar col_lens[0] = MAT_FILE_CLASSID; 944f4403165SShri Abhyankar col_lens[1] = m; 945f4403165SShri Abhyankar col_lens[2] = n; 946f4403165SShri Abhyankar col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 947f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 948f4403165SShri Abhyankar ierr = PetscFree(col_lens);CHKERRQ(ierr); 949f4403165SShri Abhyankar 950f4403165SShri Abhyankar /* write out matrix, by rows */ 951f4403165SShri Abhyankar ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr); 952f4403165SShri Abhyankar v = a->v; 953f4403165SShri Abhyankar for (j=0; j<n; j++) { 954f4403165SShri Abhyankar for (i=0; i<m; i++) { 955f4403165SShri Abhyankar vals[j + i*n] = *v++; 956f4403165SShri Abhyankar } 957f4403165SShri Abhyankar } 958f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 959f4403165SShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 960f4403165SShri Abhyankar } else { 96113f74950SBarry Smith ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 9620700a824SBarry Smith col_lens[0] = MAT_FILE_CLASSID; 963932b0c3eSLois Curfman McInnes col_lens[1] = m; 964932b0c3eSLois Curfman McInnes col_lens[2] = n; 965932b0c3eSLois Curfman McInnes col_lens[3] = nz; 966932b0c3eSLois Curfman McInnes 967932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 968932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 9696f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 970932b0c3eSLois Curfman McInnes 971932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 972932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 973932b0c3eSLois Curfman McInnes ict = 0; 974932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 975932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 976932b0c3eSLois Curfman McInnes } 9776f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 978606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 979932b0c3eSLois Curfman McInnes 980932b0c3eSLois Curfman McInnes /* store nonzero values */ 98187828ca2SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr); 982932b0c3eSLois Curfman McInnes ict = 0; 983932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 984932b0c3eSLois Curfman McInnes v = a->v + i; 985932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 9861b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 987932b0c3eSLois Curfman McInnes } 988932b0c3eSLois Curfman McInnes } 9896f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 990606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 991f4403165SShri Abhyankar } 9923a40ed3dSBarry Smith PetscFunctionReturn(0); 993932b0c3eSLois Curfman McInnes } 994932b0c3eSLois Curfman McInnes 9954a2ae208SSatish Balay #undef __FUNCT__ 9964a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom" 997dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 998f1af5d2fSBarry Smith { 999f1af5d2fSBarry Smith Mat A = (Mat) Aa; 1000f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 10016849ba73SBarry Smith PetscErrorCode ierr; 1002d0f46423SBarry Smith PetscInt m = A->rmap->n,n = A->cmap->n,color,i,j; 100387828ca2SBarry Smith PetscScalar *v = a->v; 1004b0a32e0cSBarry Smith PetscViewer viewer; 1005b0a32e0cSBarry Smith PetscDraw popup; 1006329f5518SBarry Smith PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0; 1007f3ef73ceSBarry Smith PetscViewerFormat format; 1008f1af5d2fSBarry Smith 1009f1af5d2fSBarry Smith PetscFunctionBegin; 1010f1af5d2fSBarry Smith 1011f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1012b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1013b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1014f1af5d2fSBarry Smith 1015f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1016fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1017f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1018b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1019f1af5d2fSBarry Smith for(j = 0; j < n; j++) { 1020f1af5d2fSBarry Smith x_l = j; 1021f1af5d2fSBarry Smith x_r = x_l + 1.0; 1022f1af5d2fSBarry Smith for(i = 0; i < m; i++) { 1023f1af5d2fSBarry Smith y_l = m - i - 1.0; 1024f1af5d2fSBarry Smith y_r = y_l + 1.0; 1025f1af5d2fSBarry Smith #if defined(PETSC_USE_COMPLEX) 1026329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1027b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1028329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1029b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1030f1af5d2fSBarry Smith } else { 1031f1af5d2fSBarry Smith continue; 1032f1af5d2fSBarry Smith } 1033f1af5d2fSBarry Smith #else 1034f1af5d2fSBarry Smith if (v[j*m+i] > 0.) { 1035b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1036f1af5d2fSBarry Smith } else if (v[j*m+i] < 0.) { 1037b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1038f1af5d2fSBarry Smith } else { 1039f1af5d2fSBarry Smith continue; 1040f1af5d2fSBarry Smith } 1041f1af5d2fSBarry Smith #endif 1042b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1043f1af5d2fSBarry Smith } 1044f1af5d2fSBarry Smith } 1045f1af5d2fSBarry Smith } else { 1046f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1047f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1048f1af5d2fSBarry Smith for(i = 0; i < m*n; i++) { 1049f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1050f1af5d2fSBarry Smith } 1051b0a32e0cSBarry Smith scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv; 1052b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 1053b0a32e0cSBarry Smith if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);} 1054f1af5d2fSBarry Smith for(j = 0; j < n; j++) { 1055f1af5d2fSBarry Smith x_l = j; 1056f1af5d2fSBarry Smith x_r = x_l + 1.0; 1057f1af5d2fSBarry Smith for(i = 0; i < m; i++) { 1058f1af5d2fSBarry Smith y_l = m - i - 1.0; 1059f1af5d2fSBarry Smith y_r = y_l + 1.0; 1060b0a32e0cSBarry Smith color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i])); 1061b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1062f1af5d2fSBarry Smith } 1063f1af5d2fSBarry Smith } 1064f1af5d2fSBarry Smith } 1065f1af5d2fSBarry Smith PetscFunctionReturn(0); 1066f1af5d2fSBarry Smith } 1067f1af5d2fSBarry Smith 10684a2ae208SSatish Balay #undef __FUNCT__ 10694a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 1070dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1071f1af5d2fSBarry Smith { 1072b0a32e0cSBarry Smith PetscDraw draw; 1073ace3abfcSBarry Smith PetscBool isnull; 1074329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1075dfbe8321SBarry Smith PetscErrorCode ierr; 1076f1af5d2fSBarry Smith 1077f1af5d2fSBarry Smith PetscFunctionBegin; 1078b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1079b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1080abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1081f1af5d2fSBarry Smith 1082f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1083d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1084f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1085b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1086b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 1087f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr); 1088f1af5d2fSBarry Smith PetscFunctionReturn(0); 1089f1af5d2fSBarry Smith } 1090f1af5d2fSBarry Smith 10914a2ae208SSatish Balay #undef __FUNCT__ 10924a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 1093dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1094932b0c3eSLois Curfman McInnes { 1095dfbe8321SBarry Smith PetscErrorCode ierr; 1096ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1097932b0c3eSLois Curfman McInnes 10983a40ed3dSBarry Smith PetscFunctionBegin; 10992692d6eeSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 11002692d6eeSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 11012692d6eeSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 11020f5bd95cSBarry Smith 1103c45a1595SBarry Smith if (iascii) { 1104c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 11050f5bd95cSBarry Smith } else if (isbinary) { 11063a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1107f1af5d2fSBarry Smith } else if (isdraw) { 1108f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 11095cd90555SBarry Smith } else { 1110e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name); 1111932b0c3eSLois Curfman McInnes } 11123a40ed3dSBarry Smith PetscFunctionReturn(0); 1113932b0c3eSLois Curfman McInnes } 1114289bc588SBarry Smith 11154a2ae208SSatish Balay #undef __FUNCT__ 11164a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1117dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat) 1118289bc588SBarry Smith { 1119ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1120dfbe8321SBarry Smith PetscErrorCode ierr; 112190f02eecSBarry Smith 11223a40ed3dSBarry Smith PetscFunctionBegin; 1123aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1124d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1125a5a9c739SBarry Smith #endif 112605b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 11276857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1128606d414cSSatish Balay ierr = PetscFree(l);CHKERRQ(ierr); 1129dbd8c25aSHong Zhang 1130dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1131901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr); 11324ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMult_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11334ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11344ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11353a40ed3dSBarry Smith PetscFunctionReturn(0); 1136289bc588SBarry Smith } 1137289bc588SBarry Smith 11384a2ae208SSatish Balay #undef __FUNCT__ 11394a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1140fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1141289bc588SBarry Smith { 1142c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 11436849ba73SBarry Smith PetscErrorCode ierr; 114413f74950SBarry Smith PetscInt k,j,m,n,M; 114587828ca2SBarry Smith PetscScalar *v,tmp; 114648b35521SBarry Smith 11473a40ed3dSBarry Smith PetscFunctionBegin; 1148d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 1149e9695a30SBarry Smith if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */ 1150e7e72b3dSBarry Smith if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1151e7e72b3dSBarry Smith else { 1152d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1153289bc588SBarry Smith for (k=0; k<j; k++) { 11541b807ce4Svictorle tmp = v[j + k*M]; 11551b807ce4Svictorle v[j + k*M] = v[k + j*M]; 11561b807ce4Svictorle v[k + j*M] = tmp; 1157289bc588SBarry Smith } 1158289bc588SBarry Smith } 1159d64ed03dSBarry Smith } 11603a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1161d3e5ee88SLois Curfman McInnes Mat tmat; 1162ec8511deSBarry Smith Mat_SeqDense *tmatd; 116387828ca2SBarry Smith PetscScalar *v2; 1164ea709b57SSatish Balay 1165fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX) { 11667adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,&tmat);CHKERRQ(ierr); 1167d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 11687adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 11695c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr); 1170fc4dec0aSBarry Smith } else { 1171fc4dec0aSBarry Smith tmat = *matout; 1172fc4dec0aSBarry Smith } 1173ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 11740de55854SLois Curfman McInnes v = mat->v; v2 = tmatd->v; 1175d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 11761b807ce4Svictorle for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M]; 1177d3e5ee88SLois Curfman McInnes } 11786d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 11796d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1180d3e5ee88SLois Curfman McInnes *matout = tmat; 118148b35521SBarry Smith } 11823a40ed3dSBarry Smith PetscFunctionReturn(0); 1183289bc588SBarry Smith } 1184289bc588SBarry Smith 11854a2ae208SSatish Balay #undef __FUNCT__ 11864a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1187ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1188289bc588SBarry Smith { 1189c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1190c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 119113f74950SBarry Smith PetscInt i,j; 119287828ca2SBarry Smith PetscScalar *v1 = mat1->v,*v2 = mat2->v; 11939ea5d5aeSSatish Balay 11943a40ed3dSBarry Smith PetscFunctionBegin; 1195d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1196d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1197d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 11981b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1199d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 12003a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 12011b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 12021b807ce4Svictorle } 1203289bc588SBarry Smith } 120477c4ece6SBarry Smith *flg = PETSC_TRUE; 12053a40ed3dSBarry Smith PetscFunctionReturn(0); 1206289bc588SBarry Smith } 1207289bc588SBarry Smith 12084a2ae208SSatish Balay #undef __FUNCT__ 12094a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1210dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1211289bc588SBarry Smith { 1212c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1213dfbe8321SBarry Smith PetscErrorCode ierr; 121413f74950SBarry Smith PetscInt i,n,len; 121587828ca2SBarry Smith PetscScalar *x,zero = 0.0; 121644cd7ae7SLois Curfman McInnes 12173a40ed3dSBarry Smith PetscFunctionBegin; 12182dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 12197a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 12201ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1221d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1222e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 122344cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 12241b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1225289bc588SBarry Smith } 12261ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 12273a40ed3dSBarry Smith PetscFunctionReturn(0); 1228289bc588SBarry Smith } 1229289bc588SBarry Smith 12304a2ae208SSatish Balay #undef __FUNCT__ 12314a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1232dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1233289bc588SBarry Smith { 1234c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 123587828ca2SBarry Smith PetscScalar *l,*r,x,*v; 1236dfbe8321SBarry Smith PetscErrorCode ierr; 1237d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 123855659b69SBarry Smith 12393a40ed3dSBarry Smith PetscFunctionBegin; 124028988994SBarry Smith if (ll) { 12417a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 12421ebc52fbSHong Zhang ierr = VecGetArray(ll,&l);CHKERRQ(ierr); 1243e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1244da3a660dSBarry Smith for (i=0; i<m; i++) { 1245da3a660dSBarry Smith x = l[i]; 1246da3a660dSBarry Smith v = mat->v + i; 1247da3a660dSBarry Smith for (j=0; j<n; j++) { (*v) *= x; v+= m;} 1248da3a660dSBarry Smith } 12491ebc52fbSHong Zhang ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr); 1250efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1251da3a660dSBarry Smith } 125228988994SBarry Smith if (rr) { 12537a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 12541ebc52fbSHong Zhang ierr = VecGetArray(rr,&r);CHKERRQ(ierr); 1255e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1256da3a660dSBarry Smith for (i=0; i<n; i++) { 1257da3a660dSBarry Smith x = r[i]; 1258da3a660dSBarry Smith v = mat->v + i*m; 1259da3a660dSBarry Smith for (j=0; j<m; j++) { (*v++) *= x;} 1260da3a660dSBarry Smith } 12611ebc52fbSHong Zhang ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr); 1262efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1263da3a660dSBarry Smith } 12643a40ed3dSBarry Smith PetscFunctionReturn(0); 1265289bc588SBarry Smith } 1266289bc588SBarry Smith 12674a2ae208SSatish Balay #undef __FUNCT__ 12684a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1269dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1270289bc588SBarry Smith { 1271c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 127287828ca2SBarry Smith PetscScalar *v = mat->v; 1273329f5518SBarry Smith PetscReal sum = 0.0; 1274d0f46423SBarry Smith PetscInt lda=mat->lda,m=A->rmap->n,i,j; 1275efee365bSSatish Balay PetscErrorCode ierr; 127655659b69SBarry Smith 12773a40ed3dSBarry Smith PetscFunctionBegin; 1278289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1279a5ce6ee0Svictorle if (lda>m) { 1280d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1281a5ce6ee0Svictorle v = mat->v+j*lda; 1282a5ce6ee0Svictorle for (i=0; i<m; i++) { 1283a5ce6ee0Svictorle #if defined(PETSC_USE_COMPLEX) 1284a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1285a5ce6ee0Svictorle #else 1286a5ce6ee0Svictorle sum += (*v)*(*v); v++; 1287a5ce6ee0Svictorle #endif 1288a5ce6ee0Svictorle } 1289a5ce6ee0Svictorle } 1290a5ce6ee0Svictorle } else { 1291d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1292aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1293329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1294289bc588SBarry Smith #else 1295289bc588SBarry Smith sum += (*v)*(*v); v++; 1296289bc588SBarry Smith #endif 1297289bc588SBarry Smith } 1298a5ce6ee0Svictorle } 1299064f8208SBarry Smith *nrm = sqrt(sum); 1300dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13013a40ed3dSBarry Smith } else if (type == NORM_1) { 1302064f8208SBarry Smith *nrm = 0.0; 1303d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 13041b807ce4Svictorle v = mat->v + j*mat->lda; 1305289bc588SBarry Smith sum = 0.0; 1306d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 130733a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1308289bc588SBarry Smith } 1309064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1310289bc588SBarry Smith } 1311d0f46423SBarry Smith ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13123a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1313064f8208SBarry Smith *nrm = 0.0; 1314d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1315289bc588SBarry Smith v = mat->v + j; 1316289bc588SBarry Smith sum = 0.0; 1317d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 13181b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1319289bc588SBarry Smith } 1320064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1321289bc588SBarry Smith } 1322d0f46423SBarry Smith ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1323e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 13243a40ed3dSBarry Smith PetscFunctionReturn(0); 1325289bc588SBarry Smith } 1326289bc588SBarry Smith 13274a2ae208SSatish Balay #undef __FUNCT__ 13284a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1329ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1330289bc588SBarry Smith { 1331c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 133263ba0a88SBarry Smith PetscErrorCode ierr; 133367e560aaSBarry Smith 13343a40ed3dSBarry Smith PetscFunctionBegin; 1335b5a2b587SKris Buschelman switch (op) { 1336b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 13374e0d8c25SBarry Smith aij->roworiented = flg; 1338b5a2b587SKris Buschelman break; 1339512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1340b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 13413971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 13424e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 1343b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1344b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 134577e54ba9SKris Buschelman case MAT_SYMMETRIC: 134677e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 13479a4540c5SBarry Smith case MAT_HERMITIAN: 13489a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 1349600fe468SBarry Smith case MAT_IGNORE_LOWER_TRIANGULAR: 1350290bbb0aSBarry Smith ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 135177e54ba9SKris Buschelman break; 1352b5a2b587SKris Buschelman default: 1353e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 13543a40ed3dSBarry Smith } 13553a40ed3dSBarry Smith PetscFunctionReturn(0); 1356289bc588SBarry Smith } 1357289bc588SBarry Smith 13584a2ae208SSatish Balay #undef __FUNCT__ 13594a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1360dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A) 13616f0a148fSBarry Smith { 1362ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 13636849ba73SBarry Smith PetscErrorCode ierr; 1364d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 13653a40ed3dSBarry Smith 13663a40ed3dSBarry Smith PetscFunctionBegin; 1367a5ce6ee0Svictorle if (lda>m) { 1368d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1369a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1370a5ce6ee0Svictorle } 1371a5ce6ee0Svictorle } else { 1372d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1373a5ce6ee0Svictorle } 13743a40ed3dSBarry Smith PetscFunctionReturn(0); 13756f0a148fSBarry Smith } 13766f0a148fSBarry Smith 13774a2ae208SSatish Balay #undef __FUNCT__ 13784a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 13792b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 13806f0a148fSBarry Smith { 138197b48c8fSBarry Smith PetscErrorCode ierr; 1382ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1383d0f46423SBarry Smith PetscInt n = A->cmap->n,i,j; 138497b48c8fSBarry Smith PetscScalar *slot,*bb; 138597b48c8fSBarry Smith const PetscScalar *xx; 138655659b69SBarry Smith 13873a40ed3dSBarry Smith PetscFunctionBegin; 138897b48c8fSBarry Smith /* fix right hand side if needed */ 138997b48c8fSBarry Smith if (x && b) { 139097b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 139197b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 139297b48c8fSBarry Smith for (i=0; i<N; i++) { 139397b48c8fSBarry Smith bb[rows[i]] = diag*xx[rows[i]]; 139497b48c8fSBarry Smith } 139597b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 139697b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 139797b48c8fSBarry Smith } 139897b48c8fSBarry Smith 13996f0a148fSBarry Smith for (i=0; i<N; i++) { 14006f0a148fSBarry Smith slot = l->v + rows[i]; 14016f0a148fSBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += n;} 14026f0a148fSBarry Smith } 1403f4df32b1SMatthew Knepley if (diag != 0.0) { 14046f0a148fSBarry Smith for (i=0; i<N; i++) { 14056f0a148fSBarry Smith slot = l->v + (n+1)*rows[i]; 1406f4df32b1SMatthew Knepley *slot = diag; 14076f0a148fSBarry Smith } 14086f0a148fSBarry Smith } 14093a40ed3dSBarry Smith PetscFunctionReturn(0); 14106f0a148fSBarry Smith } 1411557bce09SLois Curfman McInnes 14124a2ae208SSatish Balay #undef __FUNCT__ 14134a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqDense" 1414dfbe8321SBarry Smith PetscErrorCode MatGetArray_SeqDense(Mat A,PetscScalar *array[]) 141564e87e97SBarry Smith { 1416c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 14173a40ed3dSBarry Smith 14183a40ed3dSBarry Smith PetscFunctionBegin; 1419e32f2f54SBarry Smith if (mat->lda != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get array for Dense matrices with LDA different from number of rows"); 142064e87e97SBarry Smith *array = mat->v; 14213a40ed3dSBarry Smith PetscFunctionReturn(0); 142264e87e97SBarry Smith } 14230754003eSLois Curfman McInnes 14244a2ae208SSatish Balay #undef __FUNCT__ 14254a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense" 1426dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1427ff14e315SSatish Balay { 14283a40ed3dSBarry Smith PetscFunctionBegin; 142909b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 14303a40ed3dSBarry Smith PetscFunctionReturn(0); 1431ff14e315SSatish Balay } 14320754003eSLois Curfman McInnes 14334a2ae208SSatish Balay #undef __FUNCT__ 14344a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 143513f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 14360754003eSLois Curfman McInnes { 1437c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 14386849ba73SBarry Smith PetscErrorCode ierr; 14395d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 14405d0c19d7SBarry Smith const PetscInt *irow,*icol; 144187828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 14420754003eSLois Curfman McInnes Mat newmat; 14430754003eSLois Curfman McInnes 14443a40ed3dSBarry Smith PetscFunctionBegin; 144578b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 144678b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1447e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1448e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 14490754003eSLois Curfman McInnes 1450182d2002SSatish Balay /* Check submatrixcall */ 1451182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 145213f74950SBarry Smith PetscInt n_cols,n_rows; 1453182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 145421a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1455f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1456c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 145721a2c019SBarry Smith } 1458182d2002SSatish Balay newmat = *B; 1459182d2002SSatish Balay } else { 14600754003eSLois Curfman McInnes /* Create and fill new matrix */ 14617adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,&newmat);CHKERRQ(ierr); 1462f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 14637adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 14645c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr); 1465182d2002SSatish Balay } 1466182d2002SSatish Balay 1467182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1468182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1469182d2002SSatish Balay 1470182d2002SSatish Balay for (i=0; i<ncols; i++) { 14716de62eeeSBarry Smith av = v + mat->lda*icol[i]; 1472182d2002SSatish Balay for (j=0; j<nrows; j++) { 1473182d2002SSatish Balay *bv++ = av[irow[j]]; 14740754003eSLois Curfman McInnes } 14750754003eSLois Curfman McInnes } 1476182d2002SSatish Balay 1477182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 14786d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 14796d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 14800754003eSLois Curfman McInnes 14810754003eSLois Curfman McInnes /* Free work space */ 148278b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 148378b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1484182d2002SSatish Balay *B = newmat; 14853a40ed3dSBarry Smith PetscFunctionReturn(0); 14860754003eSLois Curfman McInnes } 14870754003eSLois Curfman McInnes 14884a2ae208SSatish Balay #undef __FUNCT__ 14894a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 149013f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1491905e6a2fSBarry Smith { 14926849ba73SBarry Smith PetscErrorCode ierr; 149313f74950SBarry Smith PetscInt i; 1494905e6a2fSBarry Smith 14953a40ed3dSBarry Smith PetscFunctionBegin; 1496905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1497b0a32e0cSBarry Smith ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr); 1498905e6a2fSBarry Smith } 1499905e6a2fSBarry Smith 1500905e6a2fSBarry Smith for (i=0; i<n; i++) { 15016a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1502905e6a2fSBarry Smith } 15033a40ed3dSBarry Smith PetscFunctionReturn(0); 1504905e6a2fSBarry Smith } 1505905e6a2fSBarry Smith 15064a2ae208SSatish Balay #undef __FUNCT__ 1507c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1508c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1509c0aa2d19SHong Zhang { 1510c0aa2d19SHong Zhang PetscFunctionBegin; 1511c0aa2d19SHong Zhang PetscFunctionReturn(0); 1512c0aa2d19SHong Zhang } 1513c0aa2d19SHong Zhang 1514c0aa2d19SHong Zhang #undef __FUNCT__ 1515c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1516c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1517c0aa2d19SHong Zhang { 1518c0aa2d19SHong Zhang PetscFunctionBegin; 1519c0aa2d19SHong Zhang PetscFunctionReturn(0); 1520c0aa2d19SHong Zhang } 1521c0aa2d19SHong Zhang 1522c0aa2d19SHong Zhang #undef __FUNCT__ 15234a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1524dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 15254b0e389bSBarry Smith { 15264b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data; 15276849ba73SBarry Smith PetscErrorCode ierr; 1528d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 15293a40ed3dSBarry Smith 15303a40ed3dSBarry Smith PetscFunctionBegin; 153133f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 153233f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1533cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 15343a40ed3dSBarry Smith PetscFunctionReturn(0); 15353a40ed3dSBarry Smith } 1536e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1537a5ce6ee0Svictorle if (lda1>m || lda2>m) { 15380dbb7854Svictorle for (j=0; j<n; j++) { 1539a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1540a5ce6ee0Svictorle } 1541a5ce6ee0Svictorle } else { 1542d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1543a5ce6ee0Svictorle } 1544273d9f13SBarry Smith PetscFunctionReturn(0); 1545273d9f13SBarry Smith } 1546273d9f13SBarry Smith 15474a2ae208SSatish Balay #undef __FUNCT__ 15484a2ae208SSatish Balay #define __FUNCT__ "MatSetUpPreallocation_SeqDense" 1549dfbe8321SBarry Smith PetscErrorCode MatSetUpPreallocation_SeqDense(Mat A) 1550273d9f13SBarry Smith { 1551dfbe8321SBarry Smith PetscErrorCode ierr; 1552273d9f13SBarry Smith 1553273d9f13SBarry Smith PetscFunctionBegin; 1554273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 15553a40ed3dSBarry Smith PetscFunctionReturn(0); 15564b0e389bSBarry Smith } 15574b0e389bSBarry Smith 1558284134d9SBarry Smith #undef __FUNCT__ 1559284134d9SBarry Smith #define __FUNCT__ "MatSetSizes_SeqDense" 1560284134d9SBarry Smith PetscErrorCode MatSetSizes_SeqDense(Mat A,PetscInt m,PetscInt n,PetscInt M,PetscInt N) 1561284134d9SBarry Smith { 1562284134d9SBarry Smith PetscFunctionBegin; 156321a2c019SBarry Smith /* this will not be called before lda, Mmax, and Nmax have been set */ 1564284134d9SBarry Smith m = PetscMax(m,M); 1565284134d9SBarry Smith n = PetscMax(n,N); 1566a868139aSShri Abhyankar 156786d161a7SShri Abhyankar /* if (m > a->Mmax) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot yet resize number rows of dense matrix larger then its initial size %d, requested %d",a->lda,(int)m); 156886d161a7SShri Abhyankar if (n > a->Nmax) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot yet resize number columns of dense matrix larger then its initial size %d, requested %d",a->Nmax,(int)n); 156986d161a7SShri Abhyankar */ 1570dc5cefdeSJed Brown A->rmap->n = A->rmap->N = m; 1571d0f46423SBarry Smith A->cmap->n = A->cmap->N = n; 1572284134d9SBarry Smith PetscFunctionReturn(0); 1573284134d9SBarry Smith } 1574170fe5c8SBarry Smith 1575ba337c44SJed Brown #undef __FUNCT__ 1576ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense" 1577ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1578ba337c44SJed Brown { 1579ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1580ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1581ba337c44SJed Brown PetscScalar *aa = a->v; 1582ba337c44SJed Brown 1583ba337c44SJed Brown PetscFunctionBegin; 1584ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1585ba337c44SJed Brown PetscFunctionReturn(0); 1586ba337c44SJed Brown } 1587ba337c44SJed Brown 1588ba337c44SJed Brown #undef __FUNCT__ 1589ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense" 1590ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1591ba337c44SJed Brown { 1592ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1593ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1594ba337c44SJed Brown PetscScalar *aa = a->v; 1595ba337c44SJed Brown 1596ba337c44SJed Brown PetscFunctionBegin; 1597ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1598ba337c44SJed Brown PetscFunctionReturn(0); 1599ba337c44SJed Brown } 1600ba337c44SJed Brown 1601ba337c44SJed Brown #undef __FUNCT__ 1602ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense" 1603ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 1604ba337c44SJed Brown { 1605ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1606ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1607ba337c44SJed Brown PetscScalar *aa = a->v; 1608ba337c44SJed Brown 1609ba337c44SJed Brown PetscFunctionBegin; 1610ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 1611ba337c44SJed Brown PetscFunctionReturn(0); 1612ba337c44SJed Brown } 1613284134d9SBarry Smith 1614a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1615a9fe9ddaSSatish Balay #undef __FUNCT__ 1616a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1617a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1618a9fe9ddaSSatish Balay { 1619a9fe9ddaSSatish Balay PetscErrorCode ierr; 1620a9fe9ddaSSatish Balay 1621a9fe9ddaSSatish Balay PetscFunctionBegin; 1622a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX){ 1623a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1624a9fe9ddaSSatish Balay } 1625a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1626a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1627a9fe9ddaSSatish Balay } 1628a9fe9ddaSSatish Balay 1629a9fe9ddaSSatish Balay #undef __FUNCT__ 1630a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1631a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1632a9fe9ddaSSatish Balay { 1633ee16a9a1SHong Zhang PetscErrorCode ierr; 1634d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1635ee16a9a1SHong Zhang Mat Cmat; 1636a9fe9ddaSSatish Balay 1637ee16a9a1SHong Zhang PetscFunctionBegin; 1638e32f2f54SBarry Smith if (A->cmap->n != B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->cmap->n %d != B->rmap->n %d\n",A->cmap->n,B->rmap->n); 1639ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1640ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1641ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1642ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1643ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 1644ee16a9a1SHong Zhang *C = Cmat; 1645ee16a9a1SHong Zhang PetscFunctionReturn(0); 1646ee16a9a1SHong Zhang } 1647a9fe9ddaSSatish Balay 164898a3b096SSatish Balay #undef __FUNCT__ 1649a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1650a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1651a9fe9ddaSSatish Balay { 1652a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1653a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1654a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 16550805154bSBarry Smith PetscBLASInt m,n,k; 1656a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1657a9fe9ddaSSatish Balay 1658a9fe9ddaSSatish Balay PetscFunctionBegin; 1659d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 1660d0f46423SBarry Smith n = PetscBLASIntCast(B->cmap->n); 1661d0f46423SBarry Smith k = PetscBLASIntCast(A->cmap->n); 1662a9fe9ddaSSatish Balay BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1663a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1664a9fe9ddaSSatish Balay } 1665a9fe9ddaSSatish Balay 1666a9fe9ddaSSatish Balay #undef __FUNCT__ 1667a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTranspose_SeqDense_SeqDense" 1668a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTranspose_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1669a9fe9ddaSSatish Balay { 1670a9fe9ddaSSatish Balay PetscErrorCode ierr; 1671a9fe9ddaSSatish Balay 1672a9fe9ddaSSatish Balay PetscFunctionBegin; 1673a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX){ 1674a9fe9ddaSSatish Balay ierr = MatMatMultTransposeSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1675a9fe9ddaSSatish Balay } 1676a9fe9ddaSSatish Balay ierr = MatMatMultTransposeNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1677a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1678a9fe9ddaSSatish Balay } 1679a9fe9ddaSSatish Balay 1680a9fe9ddaSSatish Balay #undef __FUNCT__ 1681a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeSymbolic_SeqDense_SeqDense" 1682a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1683a9fe9ddaSSatish Balay { 1684ee16a9a1SHong Zhang PetscErrorCode ierr; 1685d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1686ee16a9a1SHong Zhang Mat Cmat; 1687a9fe9ddaSSatish Balay 1688ee16a9a1SHong Zhang PetscFunctionBegin; 1689e32f2f54SBarry Smith if (A->rmap->n != B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->rmap->n %d != B->rmap->n %d\n",A->rmap->n,B->rmap->n); 1690ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1691ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1692ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1693ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1694ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 1695ee16a9a1SHong Zhang *C = Cmat; 1696ee16a9a1SHong Zhang PetscFunctionReturn(0); 1697ee16a9a1SHong Zhang } 1698a9fe9ddaSSatish Balay 1699a9fe9ddaSSatish Balay #undef __FUNCT__ 1700a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeNumeric_SeqDense_SeqDense" 1701a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1702a9fe9ddaSSatish Balay { 1703a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1704a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1705a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 17060805154bSBarry Smith PetscBLASInt m,n,k; 1707a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1708a9fe9ddaSSatish Balay 1709a9fe9ddaSSatish Balay PetscFunctionBegin; 1710d0f46423SBarry Smith m = PetscBLASIntCast(A->cmap->n); 1711d0f46423SBarry Smith n = PetscBLASIntCast(B->cmap->n); 1712d0f46423SBarry Smith k = PetscBLASIntCast(A->rmap->n); 17132fbe02b9SBarry Smith /* 17142fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 17152fbe02b9SBarry Smith */ 1716a9fe9ddaSSatish Balay BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1717a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1718a9fe9ddaSSatish Balay } 1719985db425SBarry Smith 1720985db425SBarry Smith #undef __FUNCT__ 1721985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 1722985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1723985db425SBarry Smith { 1724985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1725985db425SBarry Smith PetscErrorCode ierr; 1726d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1727985db425SBarry Smith PetscScalar *x; 1728985db425SBarry Smith MatScalar *aa = a->v; 1729985db425SBarry Smith 1730985db425SBarry Smith PetscFunctionBegin; 1731e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1732985db425SBarry Smith 1733985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1734985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1735985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1736e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1737985db425SBarry Smith for (i=0; i<m; i++) { 1738985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1739985db425SBarry Smith for (j=1; j<n; j++){ 1740985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1741985db425SBarry Smith } 1742985db425SBarry Smith } 1743985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1744985db425SBarry Smith PetscFunctionReturn(0); 1745985db425SBarry Smith } 1746985db425SBarry Smith 1747985db425SBarry Smith #undef __FUNCT__ 1748985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 1749985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 1750985db425SBarry Smith { 1751985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1752985db425SBarry Smith PetscErrorCode ierr; 1753d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1754985db425SBarry Smith PetscScalar *x; 1755985db425SBarry Smith PetscReal atmp; 1756985db425SBarry Smith MatScalar *aa = a->v; 1757985db425SBarry Smith 1758985db425SBarry Smith PetscFunctionBegin; 1759e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1760985db425SBarry Smith 1761985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1762985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1763985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1764e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1765985db425SBarry Smith for (i=0; i<m; i++) { 17669189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 1767985db425SBarry Smith for (j=1; j<n; j++){ 1768985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 1769985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 1770985db425SBarry Smith } 1771985db425SBarry Smith } 1772985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1773985db425SBarry Smith PetscFunctionReturn(0); 1774985db425SBarry Smith } 1775985db425SBarry Smith 1776985db425SBarry Smith #undef __FUNCT__ 1777985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 1778985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 1779985db425SBarry Smith { 1780985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1781985db425SBarry Smith PetscErrorCode ierr; 1782d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1783985db425SBarry Smith PetscScalar *x; 1784985db425SBarry Smith MatScalar *aa = a->v; 1785985db425SBarry Smith 1786985db425SBarry Smith PetscFunctionBegin; 1787e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1788985db425SBarry Smith 1789985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1790985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1791985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1792e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1793985db425SBarry Smith for (i=0; i<m; i++) { 1794985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1795985db425SBarry Smith for (j=1; j<n; j++){ 1796985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1797985db425SBarry Smith } 1798985db425SBarry Smith } 1799985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1800985db425SBarry Smith PetscFunctionReturn(0); 1801985db425SBarry Smith } 1802985db425SBarry Smith 18038d0534beSBarry Smith #undef __FUNCT__ 18048d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 18058d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 18068d0534beSBarry Smith { 18078d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 18088d0534beSBarry Smith PetscErrorCode ierr; 18098d0534beSBarry Smith PetscScalar *x; 18108d0534beSBarry Smith 18118d0534beSBarry Smith PetscFunctionBegin; 1812e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 18138d0534beSBarry Smith 18148d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1815d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 18168d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 18178d0534beSBarry Smith PetscFunctionReturn(0); 18188d0534beSBarry Smith } 18198d0534beSBarry Smith 1820289bc588SBarry Smith /* -------------------------------------------------------------------*/ 1821a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense, 1822905e6a2fSBarry Smith MatGetRow_SeqDense, 1823905e6a2fSBarry Smith MatRestoreRow_SeqDense, 1824905e6a2fSBarry Smith MatMult_SeqDense, 182597304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 18267c922b88SBarry Smith MatMultTranspose_SeqDense, 18277c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 1828db4efbfdSBarry Smith 0, 1829db4efbfdSBarry Smith 0, 1830db4efbfdSBarry Smith 0, 1831db4efbfdSBarry Smith /*10*/ 0, 1832905e6a2fSBarry Smith MatLUFactor_SeqDense, 1833905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 183441f059aeSBarry Smith MatSOR_SeqDense, 1835ec8511deSBarry Smith MatTranspose_SeqDense, 183697304618SKris Buschelman /*15*/ MatGetInfo_SeqDense, 1837905e6a2fSBarry Smith MatEqual_SeqDense, 1838905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 1839905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 1840905e6a2fSBarry Smith MatNorm_SeqDense, 1841c0aa2d19SHong Zhang /*20*/ MatAssemblyBegin_SeqDense, 1842c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 1843905e6a2fSBarry Smith MatSetOption_SeqDense, 1844905e6a2fSBarry Smith MatZeroEntries_SeqDense, 1845d519adbfSMatthew Knepley /*24*/ MatZeroRows_SeqDense, 1846db4efbfdSBarry Smith 0, 1847db4efbfdSBarry Smith 0, 1848db4efbfdSBarry Smith 0, 1849db4efbfdSBarry Smith 0, 1850d519adbfSMatthew Knepley /*29*/ MatSetUpPreallocation_SeqDense, 1851273d9f13SBarry Smith 0, 1852905e6a2fSBarry Smith 0, 1853905e6a2fSBarry Smith MatGetArray_SeqDense, 1854905e6a2fSBarry Smith MatRestoreArray_SeqDense, 1855d519adbfSMatthew Knepley /*34*/ MatDuplicate_SeqDense, 1856a5ae1ecdSBarry Smith 0, 1857a5ae1ecdSBarry Smith 0, 1858a5ae1ecdSBarry Smith 0, 1859a5ae1ecdSBarry Smith 0, 1860d519adbfSMatthew Knepley /*39*/ MatAXPY_SeqDense, 1861a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 1862a5ae1ecdSBarry Smith 0, 18634b0e389bSBarry Smith MatGetValues_SeqDense, 1864a5ae1ecdSBarry Smith MatCopy_SeqDense, 1865d519adbfSMatthew Knepley /*44*/ MatGetRowMax_SeqDense, 1866a5ae1ecdSBarry Smith MatScale_SeqDense, 1867a5ae1ecdSBarry Smith 0, 1868a5ae1ecdSBarry Smith 0, 1869a5ae1ecdSBarry Smith 0, 1870d519adbfSMatthew Knepley /*49*/ 0, 1871a5ae1ecdSBarry Smith 0, 1872a5ae1ecdSBarry Smith 0, 1873a5ae1ecdSBarry Smith 0, 1874a5ae1ecdSBarry Smith 0, 1875d519adbfSMatthew Knepley /*54*/ 0, 1876a5ae1ecdSBarry Smith 0, 1877a5ae1ecdSBarry Smith 0, 1878a5ae1ecdSBarry Smith 0, 1879a5ae1ecdSBarry Smith 0, 1880d519adbfSMatthew Knepley /*59*/ 0, 1881e03a110bSBarry Smith MatDestroy_SeqDense, 1882e03a110bSBarry Smith MatView_SeqDense, 1883357abbc8SBarry Smith 0, 188497304618SKris Buschelman 0, 1885d519adbfSMatthew Knepley /*64*/ 0, 188697304618SKris Buschelman 0, 188797304618SKris Buschelman 0, 188897304618SKris Buschelman 0, 188997304618SKris Buschelman 0, 1890d519adbfSMatthew Knepley /*69*/ MatGetRowMaxAbs_SeqDense, 189197304618SKris Buschelman 0, 189297304618SKris Buschelman 0, 189397304618SKris Buschelman 0, 189497304618SKris Buschelman 0, 1895d519adbfSMatthew Knepley /*74*/ 0, 189697304618SKris Buschelman 0, 189797304618SKris Buschelman 0, 189897304618SKris Buschelman 0, 189997304618SKris Buschelman 0, 1900d519adbfSMatthew Knepley /*79*/ 0, 190197304618SKris Buschelman 0, 190297304618SKris Buschelman 0, 190397304618SKris Buschelman 0, 19045bba2384SShri Abhyankar /*83*/ MatLoad_SeqDense, 1905865e5f61SKris Buschelman 0, 19061cbb95d3SBarry Smith MatIsHermitian_SeqDense, 1907865e5f61SKris Buschelman 0, 1908865e5f61SKris Buschelman 0, 1909865e5f61SKris Buschelman 0, 1910d519adbfSMatthew Knepley /*89*/ MatMatMult_SeqDense_SeqDense, 1911a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 1912a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 1913865e5f61SKris Buschelman 0, 1914865e5f61SKris Buschelman 0, 1915d519adbfSMatthew Knepley /*94*/ 0, 1916a9fe9ddaSSatish Balay MatMatMultTranspose_SeqDense_SeqDense, 1917a9fe9ddaSSatish Balay MatMatMultTransposeSymbolic_SeqDense_SeqDense, 1918a9fe9ddaSSatish Balay MatMatMultTransposeNumeric_SeqDense_SeqDense, 1919284134d9SBarry Smith 0, 1920d519adbfSMatthew Knepley /*99*/ 0, 1921284134d9SBarry Smith 0, 1922284134d9SBarry Smith 0, 1923ba337c44SJed Brown MatConjugate_SeqDense, 1924985db425SBarry Smith MatSetSizes_SeqDense, 1925ba337c44SJed Brown /*104*/0, 1926ba337c44SJed Brown MatRealPart_SeqDense, 1927ba337c44SJed Brown MatImaginaryPart_SeqDense, 1928985db425SBarry Smith 0, 1929985db425SBarry Smith 0, 193085e2c93fSHong Zhang /*109*/MatMatSolve_SeqDense, 1931985db425SBarry Smith 0, 19328d0534beSBarry Smith MatGetRowMin_SeqDense, 1933aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 1934aabbc4fbSShri Abhyankar 0, 1935aabbc4fbSShri Abhyankar /*114*/0, 1936aabbc4fbSShri Abhyankar 0, 1937aabbc4fbSShri Abhyankar 0, 1938aabbc4fbSShri Abhyankar 0, 1939aabbc4fbSShri Abhyankar 0, 1940aabbc4fbSShri Abhyankar /*119*/0, 1941aabbc4fbSShri Abhyankar 0, 1942aabbc4fbSShri Abhyankar 0, 19435bba2384SShri Abhyankar 0 1944985db425SBarry Smith }; 194590ace30eSBarry Smith 19464a2ae208SSatish Balay #undef __FUNCT__ 19474a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 19484b828684SBarry Smith /*@C 1949fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 1950d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 1951d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 1952289bc588SBarry Smith 1953db81eaa0SLois Curfman McInnes Collective on MPI_Comm 1954db81eaa0SLois Curfman McInnes 195520563c6bSBarry Smith Input Parameters: 1956db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 19570c775827SLois Curfman McInnes . m - number of rows 195818f449edSLois Curfman McInnes . n - number of columns 1959c0235b3cSMatthew Knepley - data - optional location of matrix data in column major order. Set data=PETSC_NULL for PETSc 1960dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 196120563c6bSBarry Smith 196220563c6bSBarry Smith Output Parameter: 196344cd7ae7SLois Curfman McInnes . A - the matrix 196420563c6bSBarry Smith 1965b259b22eSLois Curfman McInnes Notes: 196618f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 196718f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 1968b4fd4287SBarry Smith set data=PETSC_NULL. 196918f449edSLois Curfman McInnes 1970027ccd11SLois Curfman McInnes Level: intermediate 1971027ccd11SLois Curfman McInnes 1972dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 1973d65003e9SLois Curfman McInnes 1974db81eaa0SLois Curfman McInnes .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues() 197520563c6bSBarry Smith @*/ 19767087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 1977289bc588SBarry Smith { 1978dfbe8321SBarry Smith PetscErrorCode ierr; 19793b2fbd54SBarry Smith 19803a40ed3dSBarry Smith PetscFunctionBegin; 1981f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 1982f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 1983273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 1984273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 1985273d9f13SBarry Smith PetscFunctionReturn(0); 1986273d9f13SBarry Smith } 1987273d9f13SBarry Smith 19884a2ae208SSatish Balay #undef __FUNCT__ 1989afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 1990273d9f13SBarry Smith /*@C 1991273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 1992273d9f13SBarry Smith 1993273d9f13SBarry Smith Collective on MPI_Comm 1994273d9f13SBarry Smith 1995273d9f13SBarry Smith Input Parameters: 1996273d9f13SBarry Smith + A - the matrix 1997273d9f13SBarry Smith - data - the array (or PETSC_NULL) 1998273d9f13SBarry Smith 1999273d9f13SBarry Smith Notes: 2000273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2001273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2002284134d9SBarry Smith need not call this routine. 2003273d9f13SBarry Smith 2004273d9f13SBarry Smith Level: intermediate 2005273d9f13SBarry Smith 2006273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2007273d9f13SBarry Smith 2008867c911aSBarry Smith .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues(), MatSeqDenseSetLDA() 2009867c911aSBarry Smith 2010273d9f13SBarry Smith @*/ 20117087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2012273d9f13SBarry Smith { 20134ac538c5SBarry Smith PetscErrorCode ierr; 2014a23d5eceSKris Buschelman 2015a23d5eceSKris Buschelman PetscFunctionBegin; 20164ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2017a23d5eceSKris Buschelman PetscFunctionReturn(0); 2018a23d5eceSKris Buschelman } 2019a23d5eceSKris Buschelman 2020a23d5eceSKris Buschelman EXTERN_C_BEGIN 2021a23d5eceSKris Buschelman #undef __FUNCT__ 2022afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 20237087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2024a23d5eceSKris Buschelman { 2025273d9f13SBarry Smith Mat_SeqDense *b; 2026dfbe8321SBarry Smith PetscErrorCode ierr; 2027273d9f13SBarry Smith 2028273d9f13SBarry Smith PetscFunctionBegin; 2029273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2030a868139aSShri Abhyankar 203134ef9618SShri Abhyankar ierr = PetscLayoutSetBlockSize(B->rmap,1);CHKERRQ(ierr); 203234ef9618SShri Abhyankar ierr = PetscLayoutSetBlockSize(B->cmap,1);CHKERRQ(ierr); 203334ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 203434ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 203534ef9618SShri Abhyankar 2036273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 203786d161a7SShri Abhyankar b->Mmax = B->rmap->n; 203886d161a7SShri Abhyankar b->Nmax = B->cmap->n; 203986d161a7SShri Abhyankar if(b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 204086d161a7SShri Abhyankar 20419e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 20429e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 20435afd5e0cSBarry Smith ierr = PetscMalloc(b->lda*b->Nmax*sizeof(PetscScalar),&b->v);CHKERRQ(ierr); 2044284134d9SBarry Smith ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 2045284134d9SBarry Smith ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 20469e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2047273d9f13SBarry Smith } else { /* user-allocated storage */ 20489e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2049273d9f13SBarry Smith b->v = data; 2050273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2051273d9f13SBarry Smith } 20520450473dSBarry Smith B->assembled = PETSC_TRUE; 2053273d9f13SBarry Smith PetscFunctionReturn(0); 2054273d9f13SBarry Smith } 2055a23d5eceSKris Buschelman EXTERN_C_END 2056273d9f13SBarry Smith 20571b807ce4Svictorle #undef __FUNCT__ 20581b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 20591b807ce4Svictorle /*@C 20601b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 20611b807ce4Svictorle 20621b807ce4Svictorle Input parameter: 20631b807ce4Svictorle + A - the matrix 20641b807ce4Svictorle - lda - the leading dimension 20651b807ce4Svictorle 20661b807ce4Svictorle Notes: 2067867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 20681b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 20691b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 20701b807ce4Svictorle 20711b807ce4Svictorle Level: intermediate 20721b807ce4Svictorle 20731b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 20741b807ce4Svictorle 2075284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2076867c911aSBarry Smith 20771b807ce4Svictorle @*/ 20787087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 20791b807ce4Svictorle { 20801b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 208121a2c019SBarry Smith 20821b807ce4Svictorle PetscFunctionBegin; 2083e32f2f54SBarry Smith if (lda < B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->rmap->n); 20841b807ce4Svictorle b->lda = lda; 208521a2c019SBarry Smith b->changelda = PETSC_FALSE; 208621a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 20871b807ce4Svictorle PetscFunctionReturn(0); 20881b807ce4Svictorle } 20891b807ce4Svictorle 20900bad9183SKris Buschelman /*MC 2091fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 20920bad9183SKris Buschelman 20930bad9183SKris Buschelman Options Database Keys: 20940bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 20950bad9183SKris Buschelman 20960bad9183SKris Buschelman Level: beginner 20970bad9183SKris Buschelman 209889665df3SBarry Smith .seealso: MatCreateSeqDense() 209989665df3SBarry Smith 21000bad9183SKris Buschelman M*/ 21010bad9183SKris Buschelman 2102273d9f13SBarry Smith EXTERN_C_BEGIN 21034a2ae208SSatish Balay #undef __FUNCT__ 21044a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 21057087cfbeSBarry Smith PetscErrorCode MatCreate_SeqDense(Mat B) 2106273d9f13SBarry Smith { 2107273d9f13SBarry Smith Mat_SeqDense *b; 2108dfbe8321SBarry Smith PetscErrorCode ierr; 21097c334f02SBarry Smith PetscMPIInt size; 2110273d9f13SBarry Smith 2111273d9f13SBarry Smith PetscFunctionBegin; 21127adad957SLisandro Dalcin ierr = MPI_Comm_size(((PetscObject)B)->comm,&size);CHKERRQ(ierr); 2113e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 211455659b69SBarry Smith 211538f2d2fdSLisandro Dalcin ierr = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr); 2116549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 211744cd7ae7SLois Curfman McInnes B->data = (void*)b; 211818f449edSLois Curfman McInnes 211944cd7ae7SLois Curfman McInnes b->pivots = 0; 2120273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2121273d9f13SBarry Smith b->v = 0; 212221a2c019SBarry Smith b->changelda = PETSC_FALSE; 21234e220ebcSLois Curfman McInnes 2124b24902e0SBarry Smith 2125ec1065edSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_petsc_C", 2126b24902e0SBarry Smith "MatGetFactor_seqdense_petsc", 2127b24902e0SBarry Smith MatGetFactor_seqdense_petsc);CHKERRQ(ierr); 2128a23d5eceSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C", 2129a23d5eceSKris Buschelman "MatSeqDenseSetPreallocation_SeqDense", 2130a23d5eceSKris Buschelman MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 21314ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqaij_seqdense_C", 21324ae313f4SHong Zhang "MatMatMult_SeqAIJ_SeqDense", 21334ae313f4SHong Zhang MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 21344ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C", 21354ae313f4SHong Zhang "MatMatMultSymbolic_SeqAIJ_SeqDense", 21364ae313f4SHong Zhang MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 21374ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C", 21384ae313f4SHong Zhang "MatMatMultNumeric_SeqAIJ_SeqDense", 21394ae313f4SHong Zhang MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 214017667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 21413a40ed3dSBarry Smith PetscFunctionReturn(0); 2142289bc588SBarry Smith } 2143273d9f13SBarry Smith EXTERN_C_END 2144