1be1d678aSKris Buschelman 267e560aaSBarry Smith /* 367e560aaSBarry Smith Defines the basic matrix operations for sequential dense. 467e560aaSBarry Smith */ 5289bc588SBarry Smith 6c6db04a5SJed Brown #include <../src/mat/impls/dense/seq/dense.h> 7c6db04a5SJed Brown #include <petscblaslapack.h> 8289bc588SBarry Smith 96a63e612SBarry Smith #include <../src/mat/impls/aij/seq/aij.h> 106a63e612SBarry Smith EXTERN_C_BEGIN 116a63e612SBarry Smith #undef __FUNCT__ 126a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ" 136a63e612SBarry Smith PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 146a63e612SBarry Smith { 156a63e612SBarry Smith Mat B; 166a63e612SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 176a63e612SBarry Smith PetscErrorCode ierr; 186a63e612SBarry Smith PetscInt i; 196a63e612SBarry Smith PetscInt *rows; 206a63e612SBarry Smith MatScalar *aa = a->v; 216a63e612SBarry Smith 226a63e612SBarry Smith PetscFunctionBegin; 236a63e612SBarry Smith ierr = MatCreate(((PetscObject)A)->comm,&B);CHKERRQ(ierr); 246a63e612SBarry Smith ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 256a63e612SBarry Smith ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr); 266a63e612SBarry Smith ierr = MatSeqAIJSetPreallocation(B,A->cmap->n,PETSC_NULL);CHKERRQ(ierr); 276a63e612SBarry Smith 286a63e612SBarry Smith ierr = PetscMalloc(A->rmap->n*sizeof(PetscInt),&rows);CHKERRQ(ierr); 296a63e612SBarry Smith for (i=0; i<A->rmap->n; i++) rows[i] = i; 306a63e612SBarry Smith 316a63e612SBarry Smith for (i=0; i<A->cmap->n; i++) { 326a63e612SBarry Smith ierr = MatSetValues(B,A->rmap->n,rows,1,&i,aa,INSERT_VALUES);CHKERRQ(ierr); 336a63e612SBarry Smith aa += a->lda; 346a63e612SBarry Smith } 356a63e612SBarry Smith ierr = PetscFree(rows);CHKERRQ(ierr); 366a63e612SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 376a63e612SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 386a63e612SBarry Smith 396a63e612SBarry Smith if (reuse == MAT_REUSE_MATRIX) { 406a63e612SBarry Smith ierr = MatHeaderReplace(A,B);CHKERRQ(ierr); 416a63e612SBarry Smith } else { 426a63e612SBarry Smith *newmat = B; 436a63e612SBarry Smith } 446a63e612SBarry Smith PetscFunctionReturn(0); 456a63e612SBarry Smith } 466a63e612SBarry Smith EXTERN_C_END 476a63e612SBarry Smith 484a2ae208SSatish Balay #undef __FUNCT__ 494a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense" 50f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 511987afe7SBarry Smith { 521987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 53f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 5413f74950SBarry Smith PetscInt j; 550805154bSBarry Smith PetscBLASInt N,m,ldax,lday,one = 1; 56efee365bSSatish Balay PetscErrorCode ierr; 573a40ed3dSBarry Smith 583a40ed3dSBarry Smith PetscFunctionBegin; 59d0f46423SBarry Smith N = PetscBLASIntCast(X->rmap->n*X->cmap->n); 60d0f46423SBarry Smith m = PetscBLASIntCast(X->rmap->n); 610805154bSBarry Smith ldax = PetscBLASIntCast(x->lda); 620805154bSBarry Smith lday = PetscBLASIntCast(y->lda); 63a5ce6ee0Svictorle if (ldax>m || lday>m) { 64d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 65f4df32b1SMatthew Knepley BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one); 66a5ce6ee0Svictorle } 67a5ce6ee0Svictorle } else { 68f4df32b1SMatthew Knepley BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one); 69a5ce6ee0Svictorle } 700450473dSBarry Smith ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr); 713a40ed3dSBarry Smith PetscFunctionReturn(0); 721987afe7SBarry Smith } 731987afe7SBarry Smith 744a2ae208SSatish Balay #undef __FUNCT__ 754a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense" 76dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 77289bc588SBarry Smith { 78d0f46423SBarry Smith PetscInt N = A->rmap->n*A->cmap->n; 793a40ed3dSBarry Smith 803a40ed3dSBarry Smith PetscFunctionBegin; 814e220ebcSLois Curfman McInnes info->block_size = 1.0; 824e220ebcSLois Curfman McInnes info->nz_allocated = (double)N; 836de62eeeSBarry Smith info->nz_used = (double)N; 846de62eeeSBarry Smith info->nz_unneeded = (double)0; 854e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 864e220ebcSLois Curfman McInnes info->mallocs = 0; 877adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 884e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 894e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 904e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 913a40ed3dSBarry Smith PetscFunctionReturn(0); 92289bc588SBarry Smith } 93289bc588SBarry Smith 944a2ae208SSatish Balay #undef __FUNCT__ 954a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense" 96f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 9780cd9d93SLois Curfman McInnes { 98273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 99f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 100efee365bSSatish Balay PetscErrorCode ierr; 1010805154bSBarry Smith PetscBLASInt one = 1,j,nz,lda = PetscBLASIntCast(a->lda); 10280cd9d93SLois Curfman McInnes 1033a40ed3dSBarry Smith PetscFunctionBegin; 104d0f46423SBarry Smith if (lda>A->rmap->n) { 105d0f46423SBarry Smith nz = PetscBLASIntCast(A->rmap->n); 106d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 107f4df32b1SMatthew Knepley BLASscal_(&nz,&oalpha,a->v+j*lda,&one); 108a5ce6ee0Svictorle } 109a5ce6ee0Svictorle } else { 110d0f46423SBarry Smith nz = PetscBLASIntCast(A->rmap->n*A->cmap->n); 111f4df32b1SMatthew Knepley BLASscal_(&nz,&oalpha,a->v,&one); 112a5ce6ee0Svictorle } 113efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 1143a40ed3dSBarry Smith PetscFunctionReturn(0); 11580cd9d93SLois Curfman McInnes } 11680cd9d93SLois Curfman McInnes 1171cbb95d3SBarry Smith #undef __FUNCT__ 1181cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense" 119ace3abfcSBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 1201cbb95d3SBarry Smith { 1211cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 122d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,N; 1231cbb95d3SBarry Smith PetscScalar *v = a->v; 1241cbb95d3SBarry Smith 1251cbb95d3SBarry Smith PetscFunctionBegin; 1261cbb95d3SBarry Smith *fl = PETSC_FALSE; 127d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 1281cbb95d3SBarry Smith N = a->lda; 1291cbb95d3SBarry Smith 1301cbb95d3SBarry Smith for (i=0; i<m; i++) { 1311cbb95d3SBarry Smith for (j=i+1; j<m; j++) { 1321cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 1331cbb95d3SBarry Smith } 1341cbb95d3SBarry Smith } 1351cbb95d3SBarry Smith *fl = PETSC_TRUE; 1361cbb95d3SBarry Smith PetscFunctionReturn(0); 1371cbb95d3SBarry Smith } 1381cbb95d3SBarry Smith 139b24902e0SBarry Smith #undef __FUNCT__ 140b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense" 141719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 142b24902e0SBarry Smith { 143b24902e0SBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 144b24902e0SBarry Smith PetscErrorCode ierr; 145b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 146b24902e0SBarry Smith 147b24902e0SBarry Smith PetscFunctionBegin; 148aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr); 149aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr); 150719d5645SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,PETSC_NULL);CHKERRQ(ierr); 151b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 152b24902e0SBarry Smith l = (Mat_SeqDense*)newi->data; 153d0f46423SBarry Smith if (lda>A->rmap->n) { 154d0f46423SBarry Smith m = A->rmap->n; 155d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 156b24902e0SBarry Smith ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 157b24902e0SBarry Smith } 158b24902e0SBarry Smith } else { 159d0f46423SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 160b24902e0SBarry Smith } 161b24902e0SBarry Smith } 162b24902e0SBarry Smith newi->assembled = PETSC_TRUE; 163b24902e0SBarry Smith PetscFunctionReturn(0); 164b24902e0SBarry Smith } 165b24902e0SBarry Smith 1664a2ae208SSatish Balay #undef __FUNCT__ 1674a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense" 168dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 16902cad45dSBarry Smith { 1706849ba73SBarry Smith PetscErrorCode ierr; 17102cad45dSBarry Smith 1723a40ed3dSBarry Smith PetscFunctionBegin; 1735c9eb25fSBarry Smith ierr = MatCreate(((PetscObject)A)->comm,newmat);CHKERRQ(ierr); 174d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1755c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 176719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 177b24902e0SBarry Smith PetscFunctionReturn(0); 178b24902e0SBarry Smith } 179b24902e0SBarry Smith 1806ee01492SSatish Balay 1810481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*); 182719d5645SBarry Smith 1834a2ae208SSatish Balay #undef __FUNCT__ 1844a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense" 1850481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 186289bc588SBarry Smith { 1874482741eSBarry Smith MatFactorInfo info; 188a093e273SMatthew Knepley PetscErrorCode ierr; 1893a40ed3dSBarry Smith 1903a40ed3dSBarry Smith PetscFunctionBegin; 191c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 192719d5645SBarry Smith ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr); 1933a40ed3dSBarry Smith PetscFunctionReturn(0); 194289bc588SBarry Smith } 1956ee01492SSatish Balay 1960b4b3355SBarry Smith #undef __FUNCT__ 1974a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense" 198dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 199289bc588SBarry Smith { 200c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 2016849ba73SBarry Smith PetscErrorCode ierr; 20287828ca2SBarry Smith PetscScalar *x,*y; 203d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 20467e560aaSBarry Smith 2053a40ed3dSBarry Smith PetscFunctionBegin; 2061ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2071ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 208d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 209d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 210ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 211e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 212ae7cfcebSSatish Balay #else 21371044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 214e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 215ae7cfcebSSatish Balay #endif 216d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY){ 217ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 218e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 219ae7cfcebSSatish Balay #else 22071044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 221e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 222ae7cfcebSSatish Balay #endif 223289bc588SBarry Smith } 224e32f2f54SBarry Smith else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 2251ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2261ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 227dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 2283a40ed3dSBarry Smith PetscFunctionReturn(0); 229289bc588SBarry Smith } 2306ee01492SSatish Balay 2314a2ae208SSatish Balay #undef __FUNCT__ 23285e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense" 23385e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 23485e2c93fSHong Zhang { 23585e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 23685e2c93fSHong Zhang PetscErrorCode ierr; 23785e2c93fSHong Zhang PetscScalar *b,*x; 238efb80c78SLisandro Dalcin PetscInt n; 23985e2c93fSHong Zhang PetscBLASInt nrhs,info,m=PetscBLASIntCast(A->rmap->n); 240bda8bf91SBarry Smith PetscBool flg; 24185e2c93fSHong Zhang 24285e2c93fSHong Zhang PetscFunctionBegin; 243bda8bf91SBarry Smith ierr = PetscTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr); 244bda8bf91SBarry Smith if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix"); 245bda8bf91SBarry Smith ierr = PetscTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr); 246bda8bf91SBarry Smith if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix"); 247bda8bf91SBarry Smith 248efb80c78SLisandro Dalcin ierr = MatGetSize(B,PETSC_NULL,&n);CHKERRQ(ierr); 249efb80c78SLisandro Dalcin nrhs = PetscBLASIntCast(n); 25085e2c93fSHong Zhang ierr = MatGetArray(B,&b);CHKERRQ(ierr); 25185e2c93fSHong Zhang ierr = MatGetArray(X,&x);CHKERRQ(ierr); 25285e2c93fSHong Zhang 253f272c775SHong Zhang ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr); 25485e2c93fSHong Zhang 25585e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 25685e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS) 25785e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 25885e2c93fSHong Zhang #else 25985e2c93fSHong Zhang LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info); 26085e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 26185e2c93fSHong Zhang #endif 26285e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY){ 26385e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS) 26485e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 26585e2c93fSHong Zhang #else 26685e2c93fSHong Zhang LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info); 26785e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 26885e2c93fSHong Zhang #endif 26985e2c93fSHong Zhang } 27085e2c93fSHong Zhang else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 27185e2c93fSHong Zhang 27285e2c93fSHong Zhang ierr = MatRestoreArray(B,&b);CHKERRQ(ierr); 27385e2c93fSHong Zhang ierr = MatRestoreArray(X,&x);CHKERRQ(ierr); 27485e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 27585e2c93fSHong Zhang PetscFunctionReturn(0); 27685e2c93fSHong Zhang } 27785e2c93fSHong Zhang 27885e2c93fSHong Zhang #undef __FUNCT__ 2794a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense" 280dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 281da3a660dSBarry Smith { 282c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 283dfbe8321SBarry Smith PetscErrorCode ierr; 28487828ca2SBarry Smith PetscScalar *x,*y; 285d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 28667e560aaSBarry Smith 2873a40ed3dSBarry Smith PetscFunctionBegin; 2881ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2891ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 290d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 291752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 292da3a660dSBarry Smith if (mat->pivots) { 293ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 294e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 295ae7cfcebSSatish Balay #else 29671044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 297e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 298ae7cfcebSSatish Balay #endif 2997a97a34bSBarry Smith } else { 300ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 301e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 302ae7cfcebSSatish Balay #else 30371044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 304e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 305ae7cfcebSSatish Balay #endif 306da3a660dSBarry Smith } 3071ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3081ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 309dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 3103a40ed3dSBarry Smith PetscFunctionReturn(0); 311da3a660dSBarry Smith } 3126ee01492SSatish Balay 3134a2ae208SSatish Balay #undef __FUNCT__ 3144a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense" 315dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 316da3a660dSBarry Smith { 317c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 318dfbe8321SBarry Smith PetscErrorCode ierr; 31987828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 320da3a660dSBarry Smith Vec tmp = 0; 321d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 32267e560aaSBarry Smith 3233a40ed3dSBarry Smith PetscFunctionBegin; 3241ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 3251ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 326d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 327da3a660dSBarry Smith if (yy == zz) { 32878b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 32952e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 33078b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 331da3a660dSBarry Smith } 332d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 333752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 334da3a660dSBarry Smith if (mat->pivots) { 335ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 336e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 337ae7cfcebSSatish Balay #else 33871044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 339e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 340ae7cfcebSSatish Balay #endif 341a8c6a408SBarry Smith } else { 342ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 343e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 344ae7cfcebSSatish Balay #else 34571044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 346e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 347ae7cfcebSSatish Balay #endif 348da3a660dSBarry Smith } 3496bf464f9SBarry Smith if (tmp) { 3506bf464f9SBarry Smith ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 3516bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 3526bf464f9SBarry Smith } else { 3536bf464f9SBarry Smith ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 3546bf464f9SBarry Smith } 3551ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3561ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 357dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 3583a40ed3dSBarry Smith PetscFunctionReturn(0); 359da3a660dSBarry Smith } 36067e560aaSBarry Smith 3614a2ae208SSatish Balay #undef __FUNCT__ 3624a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense" 363dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 364da3a660dSBarry Smith { 365c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 3666849ba73SBarry Smith PetscErrorCode ierr; 36787828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 368da3a660dSBarry Smith Vec tmp; 369d0f46423SBarry Smith PetscBLASInt one = 1,info,m = PetscBLASIntCast(A->rmap->n); 37067e560aaSBarry Smith 3713a40ed3dSBarry Smith PetscFunctionBegin; 372d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 3731ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 3741ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 375da3a660dSBarry Smith if (yy == zz) { 37678b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 37752e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 37878b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 379da3a660dSBarry Smith } 380d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 381752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 382da3a660dSBarry Smith if (mat->pivots) { 383ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 384e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 385ae7cfcebSSatish Balay #else 38671044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 387e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 388ae7cfcebSSatish Balay #endif 3893a40ed3dSBarry Smith } else { 390ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 391e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 392ae7cfcebSSatish Balay #else 39371044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 394e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 395ae7cfcebSSatish Balay #endif 396da3a660dSBarry Smith } 39790f02eecSBarry Smith if (tmp) { 3982dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 3996bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 4003a40ed3dSBarry Smith } else { 4012dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 40290f02eecSBarry Smith } 4031ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 4041ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 405dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 4063a40ed3dSBarry Smith PetscFunctionReturn(0); 407da3a660dSBarry Smith } 408db4efbfdSBarry Smith 409db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 410db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 411db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 412db4efbfdSBarry Smith #undef __FUNCT__ 413db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense" 4140481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 415db4efbfdSBarry Smith { 416db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 417db4efbfdSBarry Smith PetscFunctionBegin; 418e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 419db4efbfdSBarry Smith #else 420db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 421db4efbfdSBarry Smith PetscErrorCode ierr; 422db4efbfdSBarry Smith PetscBLASInt n,m,info; 423db4efbfdSBarry Smith 424db4efbfdSBarry Smith PetscFunctionBegin; 425db4efbfdSBarry Smith n = PetscBLASIntCast(A->cmap->n); 426db4efbfdSBarry Smith m = PetscBLASIntCast(A->rmap->n); 427db4efbfdSBarry Smith if (!mat->pivots) { 428db4efbfdSBarry Smith ierr = PetscMalloc((A->rmap->n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr); 429db4efbfdSBarry Smith ierr = PetscLogObjectMemory(A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 430db4efbfdSBarry Smith } 431db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 4328e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 433db4efbfdSBarry Smith LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info); 4348e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 4358e57ea43SSatish Balay 436e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 437e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 438db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 439db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 440db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 441db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 442d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 443db4efbfdSBarry Smith 444dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 445db4efbfdSBarry Smith #endif 446db4efbfdSBarry Smith PetscFunctionReturn(0); 447db4efbfdSBarry Smith } 448db4efbfdSBarry Smith 449db4efbfdSBarry Smith #undef __FUNCT__ 450db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense" 4510481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 452db4efbfdSBarry Smith { 453db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 454db4efbfdSBarry Smith PetscFunctionBegin; 455e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 456db4efbfdSBarry Smith #else 457db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 458db4efbfdSBarry Smith PetscErrorCode ierr; 459db4efbfdSBarry Smith PetscBLASInt info,n = PetscBLASIntCast(A->cmap->n); 460db4efbfdSBarry Smith 461db4efbfdSBarry Smith PetscFunctionBegin; 462db4efbfdSBarry Smith ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 463db4efbfdSBarry Smith 464db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 465db4efbfdSBarry Smith LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info); 466e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 467db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 468db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 469db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 470db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 471d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 472dc0b31edSSatish Balay ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 473db4efbfdSBarry Smith #endif 474db4efbfdSBarry Smith PetscFunctionReturn(0); 475db4efbfdSBarry Smith } 476db4efbfdSBarry Smith 477db4efbfdSBarry Smith 478db4efbfdSBarry Smith #undef __FUNCT__ 479db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense" 4800481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 481db4efbfdSBarry Smith { 482db4efbfdSBarry Smith PetscErrorCode ierr; 483db4efbfdSBarry Smith MatFactorInfo info; 484db4efbfdSBarry Smith 485db4efbfdSBarry Smith PetscFunctionBegin; 486db4efbfdSBarry Smith info.fill = 1.0; 487c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 488719d5645SBarry Smith ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr); 489db4efbfdSBarry Smith PetscFunctionReturn(0); 490db4efbfdSBarry Smith } 491db4efbfdSBarry Smith 492db4efbfdSBarry Smith #undef __FUNCT__ 493db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense" 4940481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 495db4efbfdSBarry Smith { 496db4efbfdSBarry Smith PetscFunctionBegin; 497c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 498719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 499db4efbfdSBarry Smith PetscFunctionReturn(0); 500db4efbfdSBarry Smith } 501db4efbfdSBarry Smith 502db4efbfdSBarry Smith #undef __FUNCT__ 503db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense" 5040481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 505db4efbfdSBarry Smith { 506db4efbfdSBarry Smith PetscFunctionBegin; 507b66fe19dSMatthew G Knepley fact->preallocated = PETSC_TRUE; 508c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 509719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 510db4efbfdSBarry Smith PetscFunctionReturn(0); 511db4efbfdSBarry Smith } 512db4efbfdSBarry Smith 513bb5747d9SMatthew Knepley EXTERN_C_BEGIN 514db4efbfdSBarry Smith #undef __FUNCT__ 515db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc" 516db4efbfdSBarry Smith PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 517db4efbfdSBarry Smith { 518db4efbfdSBarry Smith PetscErrorCode ierr; 519db4efbfdSBarry Smith 520db4efbfdSBarry Smith PetscFunctionBegin; 521db4efbfdSBarry Smith ierr = MatCreate(((PetscObject)A)->comm,fact);CHKERRQ(ierr); 522db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 523db4efbfdSBarry Smith ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr); 524db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU){ 525db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 526db4efbfdSBarry Smith } else { 527db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 528db4efbfdSBarry Smith } 529d5f3da31SBarry Smith (*fact)->factortype = ftype; 530db4efbfdSBarry Smith PetscFunctionReturn(0); 531db4efbfdSBarry Smith } 532bb5747d9SMatthew Knepley EXTERN_C_END 533db4efbfdSBarry Smith 534289bc588SBarry Smith /* ------------------------------------------------------------------*/ 5354a2ae208SSatish Balay #undef __FUNCT__ 53641f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense" 53741f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 538289bc588SBarry Smith { 539c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 54087828ca2SBarry Smith PetscScalar *x,*b,*v = mat->v,zero = 0.0,xt; 541dfbe8321SBarry Smith PetscErrorCode ierr; 542d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 5430805154bSBarry Smith PetscBLASInt o = 1,bm = PetscBLASIntCast(m); 544289bc588SBarry Smith 5453a40ed3dSBarry Smith PetscFunctionBegin; 546289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 54771044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 5482dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 549289bc588SBarry Smith } 5501ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5511ebc52fbSHong Zhang ierr = VecGetArray(bb,&b);CHKERRQ(ierr); 552b965ef7fSBarry Smith its = its*lits; 553e32f2f54SBarry 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); 554289bc588SBarry Smith while (its--) { 555fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){ 556289bc588SBarry Smith for (i=0; i<m; i++) { 55771044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 55855a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 559289bc588SBarry Smith } 560289bc588SBarry Smith } 561fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){ 562289bc588SBarry Smith for (i=m-1; i>=0; i--) { 56371044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 56455a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 565289bc588SBarry Smith } 566289bc588SBarry Smith } 567289bc588SBarry Smith } 5681ebc52fbSHong Zhang ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr); 5691ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5703a40ed3dSBarry Smith PetscFunctionReturn(0); 571289bc588SBarry Smith } 572289bc588SBarry Smith 573289bc588SBarry Smith /* -----------------------------------------------------------------*/ 5744a2ae208SSatish Balay #undef __FUNCT__ 5754a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense" 576dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 577289bc588SBarry Smith { 578c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 57987828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 580dfbe8321SBarry Smith PetscErrorCode ierr; 5810805154bSBarry Smith PetscBLASInt m, n,_One=1; 582ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 5833a40ed3dSBarry Smith 5843a40ed3dSBarry Smith PetscFunctionBegin; 585d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 586d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 587d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5881ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5891ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 59071044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One); 5911ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5921ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 593dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 5943a40ed3dSBarry Smith PetscFunctionReturn(0); 595289bc588SBarry Smith } 596800995b7SMatthew Knepley 5974a2ae208SSatish Balay #undef __FUNCT__ 5984a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense" 599dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 600289bc588SBarry Smith { 601c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 60287828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0; 603dfbe8321SBarry Smith PetscErrorCode ierr; 6040805154bSBarry Smith PetscBLASInt m, n, _One=1; 6053a40ed3dSBarry Smith 6063a40ed3dSBarry Smith PetscFunctionBegin; 607d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 608d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 609d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 6101ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 6111ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 61271044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One); 6131ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6141ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 615dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 6163a40ed3dSBarry Smith PetscFunctionReturn(0); 617289bc588SBarry Smith } 6186ee01492SSatish Balay 6194a2ae208SSatish Balay #undef __FUNCT__ 6204a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense" 621dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 622289bc588SBarry Smith { 623c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 62487828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0; 625dfbe8321SBarry Smith PetscErrorCode ierr; 6260805154bSBarry Smith PetscBLASInt m, n, _One=1; 6273a40ed3dSBarry Smith 6283a40ed3dSBarry Smith PetscFunctionBegin; 629d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 630d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 631d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 632600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 6331ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 6341ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 63571044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 6361ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6371ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 638dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 6393a40ed3dSBarry Smith PetscFunctionReturn(0); 640289bc588SBarry Smith } 6416ee01492SSatish Balay 6424a2ae208SSatish Balay #undef __FUNCT__ 6434a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense" 644dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 645289bc588SBarry Smith { 646c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 64787828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 648dfbe8321SBarry Smith PetscErrorCode ierr; 6490805154bSBarry Smith PetscBLASInt m, n, _One=1; 65087828ca2SBarry Smith PetscScalar _DOne=1.0; 6513a40ed3dSBarry Smith 6523a40ed3dSBarry Smith PetscFunctionBegin; 653d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 654d0f46423SBarry Smith n = PetscBLASIntCast(A->cmap->n); 655d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 656600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 6571ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 6581ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 65971044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 6601ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6611ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 662dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 6633a40ed3dSBarry Smith PetscFunctionReturn(0); 664289bc588SBarry Smith } 665289bc588SBarry Smith 666289bc588SBarry Smith /* -----------------------------------------------------------------*/ 6674a2ae208SSatish Balay #undef __FUNCT__ 6684a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense" 66913f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 670289bc588SBarry Smith { 671c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 67287828ca2SBarry Smith PetscScalar *v; 6736849ba73SBarry Smith PetscErrorCode ierr; 67413f74950SBarry Smith PetscInt i; 67567e560aaSBarry Smith 6763a40ed3dSBarry Smith PetscFunctionBegin; 677d0f46423SBarry Smith *ncols = A->cmap->n; 678289bc588SBarry Smith if (cols) { 679d0f46423SBarry Smith ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr); 680d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 681289bc588SBarry Smith } 682289bc588SBarry Smith if (vals) { 683d0f46423SBarry Smith ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr); 684289bc588SBarry Smith v = mat->v + row; 685d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 686289bc588SBarry Smith } 6873a40ed3dSBarry Smith PetscFunctionReturn(0); 688289bc588SBarry Smith } 6896ee01492SSatish Balay 6904a2ae208SSatish Balay #undef __FUNCT__ 6914a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense" 69213f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 693289bc588SBarry Smith { 694dfbe8321SBarry Smith PetscErrorCode ierr; 695606d414cSSatish Balay PetscFunctionBegin; 696606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 697606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 6983a40ed3dSBarry Smith PetscFunctionReturn(0); 699289bc588SBarry Smith } 700289bc588SBarry Smith /* ----------------------------------------------------------------*/ 7014a2ae208SSatish Balay #undef __FUNCT__ 7024a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense" 70313f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 704289bc588SBarry Smith { 705c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 70613f74950SBarry Smith PetscInt i,j,idx=0; 707d6dfbf8fSBarry Smith 7083a40ed3dSBarry Smith PetscFunctionBegin; 70971fd2e92SBarry Smith if (v) PetscValidScalarPointer(v,6); 710289bc588SBarry Smith if (!mat->roworiented) { 711dbb450caSBarry Smith if (addv == INSERT_VALUES) { 712289bc588SBarry Smith for (j=0; j<n; j++) { 713cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 7142515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 715e32f2f54SBarry 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); 71658804f6dSBarry Smith #endif 717289bc588SBarry Smith for (i=0; i<m; i++) { 718cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 7192515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 720e32f2f54SBarry 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); 72158804f6dSBarry Smith #endif 722cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 723289bc588SBarry Smith } 724289bc588SBarry Smith } 7253a40ed3dSBarry Smith } else { 726289bc588SBarry Smith for (j=0; j<n; j++) { 727cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 7282515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 729e32f2f54SBarry 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); 73058804f6dSBarry Smith #endif 731289bc588SBarry Smith for (i=0; i<m; i++) { 732cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 7332515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 734e32f2f54SBarry 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); 73558804f6dSBarry Smith #endif 736cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 737289bc588SBarry Smith } 738289bc588SBarry Smith } 739289bc588SBarry Smith } 7403a40ed3dSBarry Smith } else { 741dbb450caSBarry Smith if (addv == INSERT_VALUES) { 742e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 743cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 7442515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 745e32f2f54SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1); 74658804f6dSBarry Smith #endif 747e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 748cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 7492515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 750e32f2f54SBarry 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); 75158804f6dSBarry Smith #endif 752cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 753e8d4e0b9SBarry Smith } 754e8d4e0b9SBarry Smith } 7553a40ed3dSBarry Smith } else { 756289bc588SBarry Smith for (i=0; i<m; i++) { 757cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 7582515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 759e32f2f54SBarry 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); 76058804f6dSBarry Smith #endif 761289bc588SBarry Smith for (j=0; j<n; j++) { 762cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 7632515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 764e32f2f54SBarry 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); 76558804f6dSBarry Smith #endif 766cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 767289bc588SBarry Smith } 768289bc588SBarry Smith } 769289bc588SBarry Smith } 770e8d4e0b9SBarry Smith } 7713a40ed3dSBarry Smith PetscFunctionReturn(0); 772289bc588SBarry Smith } 773e8d4e0b9SBarry Smith 7744a2ae208SSatish Balay #undef __FUNCT__ 7754a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense" 77613f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 777ae80bb75SLois Curfman McInnes { 778ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 77913f74950SBarry Smith PetscInt i,j; 780ae80bb75SLois Curfman McInnes 7813a40ed3dSBarry Smith PetscFunctionBegin; 782ae80bb75SLois Curfman McInnes /* row-oriented output */ 783ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 78497e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 785e32f2f54SBarry 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); 786ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 7876f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 788e32f2f54SBarry 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); 78997e567efSBarry Smith *v++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 790ae80bb75SLois Curfman McInnes } 791ae80bb75SLois Curfman McInnes } 7923a40ed3dSBarry Smith PetscFunctionReturn(0); 793ae80bb75SLois Curfman McInnes } 794ae80bb75SLois Curfman McInnes 795289bc588SBarry Smith /* -----------------------------------------------------------------*/ 796289bc588SBarry Smith 7974a2ae208SSatish Balay #undef __FUNCT__ 7985bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense" 799112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer) 800aabbc4fbSShri Abhyankar { 801aabbc4fbSShri Abhyankar Mat_SeqDense *a; 802aabbc4fbSShri Abhyankar PetscErrorCode ierr; 803aabbc4fbSShri Abhyankar PetscInt *scols,i,j,nz,header[4]; 804aabbc4fbSShri Abhyankar int fd; 805aabbc4fbSShri Abhyankar PetscMPIInt size; 806aabbc4fbSShri Abhyankar PetscInt *rowlengths = 0,M,N,*cols,grows,gcols; 807aabbc4fbSShri Abhyankar PetscScalar *vals,*svals,*v,*w; 808aabbc4fbSShri Abhyankar MPI_Comm comm = ((PetscObject)viewer)->comm; 809aabbc4fbSShri Abhyankar 810aabbc4fbSShri Abhyankar PetscFunctionBegin; 811aabbc4fbSShri Abhyankar ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 812aabbc4fbSShri Abhyankar if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor"); 813aabbc4fbSShri Abhyankar ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 814aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 815aabbc4fbSShri Abhyankar if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 816aabbc4fbSShri Abhyankar M = header[1]; N = header[2]; nz = header[3]; 817aabbc4fbSShri Abhyankar 818aabbc4fbSShri Abhyankar /* set global size if not set already*/ 819aabbc4fbSShri Abhyankar if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) { 820aabbc4fbSShri Abhyankar ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr); 821aabbc4fbSShri Abhyankar } else { 822aabbc4fbSShri Abhyankar /* if sizes and type are already set, check if the vector global sizes are correct */ 823aabbc4fbSShri Abhyankar ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr); 824aabbc4fbSShri 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); 825aabbc4fbSShri Abhyankar } 826aabbc4fbSShri Abhyankar ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr); 827aabbc4fbSShri Abhyankar 828aabbc4fbSShri Abhyankar if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 829aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 830aabbc4fbSShri Abhyankar v = a->v; 831aabbc4fbSShri Abhyankar /* Allocate some temp space to read in the values and then flip them 832aabbc4fbSShri Abhyankar from row major to column major */ 833aabbc4fbSShri Abhyankar ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr); 834aabbc4fbSShri Abhyankar /* read in nonzero values */ 835aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 836aabbc4fbSShri Abhyankar /* now flip the values and store them in the matrix*/ 837aabbc4fbSShri Abhyankar for (j=0; j<N; j++) { 838aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 839aabbc4fbSShri Abhyankar *v++ =w[i*N+j]; 840aabbc4fbSShri Abhyankar } 841aabbc4fbSShri Abhyankar } 842aabbc4fbSShri Abhyankar ierr = PetscFree(w);CHKERRQ(ierr); 843aabbc4fbSShri Abhyankar } else { 844aabbc4fbSShri Abhyankar /* read row lengths */ 845aabbc4fbSShri Abhyankar ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr); 846aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 847aabbc4fbSShri Abhyankar 848aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 849aabbc4fbSShri Abhyankar v = a->v; 850aabbc4fbSShri Abhyankar 851aabbc4fbSShri Abhyankar /* read column indices and nonzeros */ 852aabbc4fbSShri Abhyankar ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr); 853aabbc4fbSShri Abhyankar cols = scols; 854aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 855aabbc4fbSShri Abhyankar ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr); 856aabbc4fbSShri Abhyankar vals = svals; 857aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 858aabbc4fbSShri Abhyankar 859aabbc4fbSShri Abhyankar /* insert into matrix */ 860aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 861aabbc4fbSShri Abhyankar for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 862aabbc4fbSShri Abhyankar svals += rowlengths[i]; scols += rowlengths[i]; 863aabbc4fbSShri Abhyankar } 864aabbc4fbSShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 865aabbc4fbSShri Abhyankar ierr = PetscFree(cols);CHKERRQ(ierr); 866aabbc4fbSShri Abhyankar ierr = PetscFree(rowlengths);CHKERRQ(ierr); 867aabbc4fbSShri Abhyankar } 868aabbc4fbSShri Abhyankar ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 869aabbc4fbSShri Abhyankar ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 870aabbc4fbSShri Abhyankar 871aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 872aabbc4fbSShri Abhyankar } 873aabbc4fbSShri Abhyankar 874aabbc4fbSShri Abhyankar #undef __FUNCT__ 8754a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII" 8766849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 877289bc588SBarry Smith { 878932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 879dfbe8321SBarry Smith PetscErrorCode ierr; 88013f74950SBarry Smith PetscInt i,j; 8812dcb1b2aSMatthew Knepley const char *name; 88287828ca2SBarry Smith PetscScalar *v; 883f3ef73ceSBarry Smith PetscViewerFormat format; 8845f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 885ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 8865f481a85SSatish Balay #endif 887932b0c3eSLois Curfman McInnes 8883a40ed3dSBarry Smith PetscFunctionBegin; 889b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 890456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 8913a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 892fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 893d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 8947566de4bSShri Abhyankar ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr); 895d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 89644cd7ae7SLois Curfman McInnes v = a->v + i; 89777431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 898d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 899aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 900329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 901a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 902329f5518SBarry Smith } else if (PetscRealPart(*v)) { 903a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr); 9046831982aSBarry Smith } 90580cd9d93SLois Curfman McInnes #else 9066831982aSBarry Smith if (*v) { 907a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr); 9086831982aSBarry Smith } 90980cd9d93SLois Curfman McInnes #endif 9101b807ce4Svictorle v += a->lda; 91180cd9d93SLois Curfman McInnes } 912b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 91380cd9d93SLois Curfman McInnes } 914d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 9153a40ed3dSBarry Smith } else { 916d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 917aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 91847989497SBarry Smith /* determine if matrix has all real values */ 91947989497SBarry Smith v = a->v; 920d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 921ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;} 92247989497SBarry Smith } 92347989497SBarry Smith #endif 924fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 9253a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 926d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 927d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 928fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 9297566de4bSShri Abhyankar } else { 9307566de4bSShri Abhyankar ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr); 931ffac6cdbSBarry Smith } 932ffac6cdbSBarry Smith 933d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 934932b0c3eSLois Curfman McInnes v = a->v + i; 935d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 936aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 93747989497SBarry Smith if (allreal) { 938f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",PetscRealPart(*v));CHKERRQ(ierr); 93947989497SBarry Smith } else { 940f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 94147989497SBarry Smith } 942289bc588SBarry Smith #else 943f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",*v);CHKERRQ(ierr); 944289bc588SBarry Smith #endif 9451b807ce4Svictorle v += a->lda; 946289bc588SBarry Smith } 947b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 948289bc588SBarry Smith } 949fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 950b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 951ffac6cdbSBarry Smith } 952d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 953da3a660dSBarry Smith } 954b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 9553a40ed3dSBarry Smith PetscFunctionReturn(0); 956289bc588SBarry Smith } 957289bc588SBarry Smith 9584a2ae208SSatish Balay #undef __FUNCT__ 9594a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary" 9606849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 961932b0c3eSLois Curfman McInnes { 962932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 9636849ba73SBarry Smith PetscErrorCode ierr; 96413f74950SBarry Smith int fd; 965d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 966f4403165SShri Abhyankar PetscScalar *v,*anonz,*vals; 967f4403165SShri Abhyankar PetscViewerFormat format; 968932b0c3eSLois Curfman McInnes 9693a40ed3dSBarry Smith PetscFunctionBegin; 970b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 97190ace30eSBarry Smith 972f4403165SShri Abhyankar ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 973f4403165SShri Abhyankar if (format == PETSC_VIEWER_NATIVE) { 974f4403165SShri Abhyankar /* store the matrix as a dense matrix */ 975f4403165SShri Abhyankar ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 976f4403165SShri Abhyankar col_lens[0] = MAT_FILE_CLASSID; 977f4403165SShri Abhyankar col_lens[1] = m; 978f4403165SShri Abhyankar col_lens[2] = n; 979f4403165SShri Abhyankar col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 980f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 981f4403165SShri Abhyankar ierr = PetscFree(col_lens);CHKERRQ(ierr); 982f4403165SShri Abhyankar 983f4403165SShri Abhyankar /* write out matrix, by rows */ 984f4403165SShri Abhyankar ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr); 985f4403165SShri Abhyankar v = a->v; 986f4403165SShri Abhyankar for (j=0; j<n; j++) { 987f4403165SShri Abhyankar for (i=0; i<m; i++) { 988f4403165SShri Abhyankar vals[j + i*n] = *v++; 989f4403165SShri Abhyankar } 990f4403165SShri Abhyankar } 991f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 992f4403165SShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 993f4403165SShri Abhyankar } else { 99413f74950SBarry Smith ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 9950700a824SBarry Smith col_lens[0] = MAT_FILE_CLASSID; 996932b0c3eSLois Curfman McInnes col_lens[1] = m; 997932b0c3eSLois Curfman McInnes col_lens[2] = n; 998932b0c3eSLois Curfman McInnes col_lens[3] = nz; 999932b0c3eSLois Curfman McInnes 1000932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 1001932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 10026f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1003932b0c3eSLois Curfman McInnes 1004932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 1005932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 1006932b0c3eSLois Curfman McInnes ict = 0; 1007932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1008932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 1009932b0c3eSLois Curfman McInnes } 10106f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 1011606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 1012932b0c3eSLois Curfman McInnes 1013932b0c3eSLois Curfman McInnes /* store nonzero values */ 101487828ca2SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr); 1015932b0c3eSLois Curfman McInnes ict = 0; 1016932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1017932b0c3eSLois Curfman McInnes v = a->v + i; 1018932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 10191b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 1020932b0c3eSLois Curfman McInnes } 1021932b0c3eSLois Curfman McInnes } 10226f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1023606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 1024f4403165SShri Abhyankar } 10253a40ed3dSBarry Smith PetscFunctionReturn(0); 1026932b0c3eSLois Curfman McInnes } 1027932b0c3eSLois Curfman McInnes 10284a2ae208SSatish Balay #undef __FUNCT__ 10294a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom" 1030dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1031f1af5d2fSBarry Smith { 1032f1af5d2fSBarry Smith Mat A = (Mat) Aa; 1033f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 10346849ba73SBarry Smith PetscErrorCode ierr; 1035d0f46423SBarry Smith PetscInt m = A->rmap->n,n = A->cmap->n,color,i,j; 103687828ca2SBarry Smith PetscScalar *v = a->v; 1037b0a32e0cSBarry Smith PetscViewer viewer; 1038b0a32e0cSBarry Smith PetscDraw popup; 1039329f5518SBarry Smith PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0; 1040f3ef73ceSBarry Smith PetscViewerFormat format; 1041f1af5d2fSBarry Smith 1042f1af5d2fSBarry Smith PetscFunctionBegin; 1043f1af5d2fSBarry Smith 1044f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1045b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1046b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1047f1af5d2fSBarry Smith 1048f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1049fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1050f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1051b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1052f1af5d2fSBarry Smith for(j = 0; j < n; j++) { 1053f1af5d2fSBarry Smith x_l = j; 1054f1af5d2fSBarry Smith x_r = x_l + 1.0; 1055f1af5d2fSBarry Smith for(i = 0; i < m; i++) { 1056f1af5d2fSBarry Smith y_l = m - i - 1.0; 1057f1af5d2fSBarry Smith y_r = y_l + 1.0; 1058f1af5d2fSBarry Smith #if defined(PETSC_USE_COMPLEX) 1059329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1060b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1061329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1062b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1063f1af5d2fSBarry Smith } else { 1064f1af5d2fSBarry Smith continue; 1065f1af5d2fSBarry Smith } 1066f1af5d2fSBarry Smith #else 1067f1af5d2fSBarry Smith if (v[j*m+i] > 0.) { 1068b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1069f1af5d2fSBarry Smith } else if (v[j*m+i] < 0.) { 1070b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1071f1af5d2fSBarry Smith } else { 1072f1af5d2fSBarry Smith continue; 1073f1af5d2fSBarry Smith } 1074f1af5d2fSBarry Smith #endif 1075b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1076f1af5d2fSBarry Smith } 1077f1af5d2fSBarry Smith } 1078f1af5d2fSBarry Smith } else { 1079f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1080f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1081f1af5d2fSBarry Smith for(i = 0; i < m*n; i++) { 1082f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1083f1af5d2fSBarry Smith } 1084b0a32e0cSBarry Smith scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv; 1085b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 1086b0a32e0cSBarry Smith if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);} 1087f1af5d2fSBarry Smith for(j = 0; j < n; j++) { 1088f1af5d2fSBarry Smith x_l = j; 1089f1af5d2fSBarry Smith x_r = x_l + 1.0; 1090f1af5d2fSBarry Smith for(i = 0; i < m; i++) { 1091f1af5d2fSBarry Smith y_l = m - i - 1.0; 1092f1af5d2fSBarry Smith y_r = y_l + 1.0; 1093b0a32e0cSBarry Smith color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i])); 1094b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1095f1af5d2fSBarry Smith } 1096f1af5d2fSBarry Smith } 1097f1af5d2fSBarry Smith } 1098f1af5d2fSBarry Smith PetscFunctionReturn(0); 1099f1af5d2fSBarry Smith } 1100f1af5d2fSBarry Smith 11014a2ae208SSatish Balay #undef __FUNCT__ 11024a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 1103dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1104f1af5d2fSBarry Smith { 1105b0a32e0cSBarry Smith PetscDraw draw; 1106ace3abfcSBarry Smith PetscBool isnull; 1107329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1108dfbe8321SBarry Smith PetscErrorCode ierr; 1109f1af5d2fSBarry Smith 1110f1af5d2fSBarry Smith PetscFunctionBegin; 1111b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1112b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1113abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1114f1af5d2fSBarry Smith 1115f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1116d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1117f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1118b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1119b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 1120f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr); 1121f1af5d2fSBarry Smith PetscFunctionReturn(0); 1122f1af5d2fSBarry Smith } 1123f1af5d2fSBarry Smith 11244a2ae208SSatish Balay #undef __FUNCT__ 11254a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 1126dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1127932b0c3eSLois Curfman McInnes { 1128dfbe8321SBarry Smith PetscErrorCode ierr; 1129ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1130932b0c3eSLois Curfman McInnes 11313a40ed3dSBarry Smith PetscFunctionBegin; 11322692d6eeSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 11332692d6eeSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 11342692d6eeSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 11350f5bd95cSBarry Smith 1136c45a1595SBarry Smith if (iascii) { 1137c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 11380f5bd95cSBarry Smith } else if (isbinary) { 11393a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1140f1af5d2fSBarry Smith } else if (isdraw) { 1141f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 11425cd90555SBarry Smith } else { 1143e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name); 1144932b0c3eSLois Curfman McInnes } 11453a40ed3dSBarry Smith PetscFunctionReturn(0); 1146932b0c3eSLois Curfman McInnes } 1147289bc588SBarry Smith 11484a2ae208SSatish Balay #undef __FUNCT__ 11494a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1150dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat) 1151289bc588SBarry Smith { 1152ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1153dfbe8321SBarry Smith PetscErrorCode ierr; 115490f02eecSBarry Smith 11553a40ed3dSBarry Smith PetscFunctionBegin; 1156aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1157d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1158a5a9c739SBarry Smith #endif 115905b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 11606857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1161bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1162dbd8c25aSHong Zhang 1163dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1164901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr); 11654ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMult_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11664ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11674ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11683a40ed3dSBarry Smith PetscFunctionReturn(0); 1169289bc588SBarry Smith } 1170289bc588SBarry Smith 11714a2ae208SSatish Balay #undef __FUNCT__ 11724a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1173fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1174289bc588SBarry Smith { 1175c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 11766849ba73SBarry Smith PetscErrorCode ierr; 117713f74950SBarry Smith PetscInt k,j,m,n,M; 117887828ca2SBarry Smith PetscScalar *v,tmp; 117948b35521SBarry Smith 11803a40ed3dSBarry Smith PetscFunctionBegin; 1181d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 1182e9695a30SBarry Smith if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */ 1183e7e72b3dSBarry Smith if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1184e7e72b3dSBarry Smith else { 1185d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1186289bc588SBarry Smith for (k=0; k<j; k++) { 11871b807ce4Svictorle tmp = v[j + k*M]; 11881b807ce4Svictorle v[j + k*M] = v[k + j*M]; 11891b807ce4Svictorle v[k + j*M] = tmp; 1190289bc588SBarry Smith } 1191289bc588SBarry Smith } 1192d64ed03dSBarry Smith } 11933a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1194d3e5ee88SLois Curfman McInnes Mat tmat; 1195ec8511deSBarry Smith Mat_SeqDense *tmatd; 119687828ca2SBarry Smith PetscScalar *v2; 1197ea709b57SSatish Balay 1198fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX) { 11997adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,&tmat);CHKERRQ(ierr); 1200d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 12017adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 12025c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr); 1203fc4dec0aSBarry Smith } else { 1204fc4dec0aSBarry Smith tmat = *matout; 1205fc4dec0aSBarry Smith } 1206ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 12070de55854SLois Curfman McInnes v = mat->v; v2 = tmatd->v; 1208d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 12091b807ce4Svictorle for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M]; 1210d3e5ee88SLois Curfman McInnes } 12116d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 12126d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1213d3e5ee88SLois Curfman McInnes *matout = tmat; 121448b35521SBarry Smith } 12153a40ed3dSBarry Smith PetscFunctionReturn(0); 1216289bc588SBarry Smith } 1217289bc588SBarry Smith 12184a2ae208SSatish Balay #undef __FUNCT__ 12194a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1220ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1221289bc588SBarry Smith { 1222c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1223c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 122413f74950SBarry Smith PetscInt i,j; 122587828ca2SBarry Smith PetscScalar *v1 = mat1->v,*v2 = mat2->v; 12269ea5d5aeSSatish Balay 12273a40ed3dSBarry Smith PetscFunctionBegin; 1228d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1229d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1230d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 12311b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1232d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 12333a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 12341b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 12351b807ce4Svictorle } 1236289bc588SBarry Smith } 123777c4ece6SBarry Smith *flg = PETSC_TRUE; 12383a40ed3dSBarry Smith PetscFunctionReturn(0); 1239289bc588SBarry Smith } 1240289bc588SBarry Smith 12414a2ae208SSatish Balay #undef __FUNCT__ 12424a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1243dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1244289bc588SBarry Smith { 1245c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1246dfbe8321SBarry Smith PetscErrorCode ierr; 124713f74950SBarry Smith PetscInt i,n,len; 124887828ca2SBarry Smith PetscScalar *x,zero = 0.0; 124944cd7ae7SLois Curfman McInnes 12503a40ed3dSBarry Smith PetscFunctionBegin; 12512dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 12527a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 12531ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1254d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1255e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 125644cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 12571b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1258289bc588SBarry Smith } 12591ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 12603a40ed3dSBarry Smith PetscFunctionReturn(0); 1261289bc588SBarry Smith } 1262289bc588SBarry Smith 12634a2ae208SSatish Balay #undef __FUNCT__ 12644a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1265dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1266289bc588SBarry Smith { 1267c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 126887828ca2SBarry Smith PetscScalar *l,*r,x,*v; 1269dfbe8321SBarry Smith PetscErrorCode ierr; 1270d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 127155659b69SBarry Smith 12723a40ed3dSBarry Smith PetscFunctionBegin; 127328988994SBarry Smith if (ll) { 12747a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 12751ebc52fbSHong Zhang ierr = VecGetArray(ll,&l);CHKERRQ(ierr); 1276e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1277da3a660dSBarry Smith for (i=0; i<m; i++) { 1278da3a660dSBarry Smith x = l[i]; 1279da3a660dSBarry Smith v = mat->v + i; 1280da3a660dSBarry Smith for (j=0; j<n; j++) { (*v) *= x; v+= m;} 1281da3a660dSBarry Smith } 12821ebc52fbSHong Zhang ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr); 1283efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1284da3a660dSBarry Smith } 128528988994SBarry Smith if (rr) { 12867a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 12871ebc52fbSHong Zhang ierr = VecGetArray(rr,&r);CHKERRQ(ierr); 1288e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1289da3a660dSBarry Smith for (i=0; i<n; i++) { 1290da3a660dSBarry Smith x = r[i]; 1291da3a660dSBarry Smith v = mat->v + i*m; 1292da3a660dSBarry Smith for (j=0; j<m; j++) { (*v++) *= x;} 1293da3a660dSBarry Smith } 12941ebc52fbSHong Zhang ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr); 1295efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1296da3a660dSBarry Smith } 12973a40ed3dSBarry Smith PetscFunctionReturn(0); 1298289bc588SBarry Smith } 1299289bc588SBarry Smith 13004a2ae208SSatish Balay #undef __FUNCT__ 13014a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1302dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1303289bc588SBarry Smith { 1304c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 130587828ca2SBarry Smith PetscScalar *v = mat->v; 1306329f5518SBarry Smith PetscReal sum = 0.0; 1307d0f46423SBarry Smith PetscInt lda=mat->lda,m=A->rmap->n,i,j; 1308efee365bSSatish Balay PetscErrorCode ierr; 130955659b69SBarry Smith 13103a40ed3dSBarry Smith PetscFunctionBegin; 1311289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1312a5ce6ee0Svictorle if (lda>m) { 1313d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1314a5ce6ee0Svictorle v = mat->v+j*lda; 1315a5ce6ee0Svictorle for (i=0; i<m; i++) { 1316a5ce6ee0Svictorle #if defined(PETSC_USE_COMPLEX) 1317a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1318a5ce6ee0Svictorle #else 1319a5ce6ee0Svictorle sum += (*v)*(*v); v++; 1320a5ce6ee0Svictorle #endif 1321a5ce6ee0Svictorle } 1322a5ce6ee0Svictorle } 1323a5ce6ee0Svictorle } else { 1324d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1325aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1326329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1327289bc588SBarry Smith #else 1328289bc588SBarry Smith sum += (*v)*(*v); v++; 1329289bc588SBarry Smith #endif 1330289bc588SBarry Smith } 1331a5ce6ee0Svictorle } 13328f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1333dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13343a40ed3dSBarry Smith } else if (type == NORM_1) { 1335064f8208SBarry Smith *nrm = 0.0; 1336d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 13371b807ce4Svictorle v = mat->v + j*mat->lda; 1338289bc588SBarry Smith sum = 0.0; 1339d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 134033a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1341289bc588SBarry Smith } 1342064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1343289bc588SBarry Smith } 1344d0f46423SBarry Smith ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13453a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1346064f8208SBarry Smith *nrm = 0.0; 1347d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1348289bc588SBarry Smith v = mat->v + j; 1349289bc588SBarry Smith sum = 0.0; 1350d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 13511b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1352289bc588SBarry Smith } 1353064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1354289bc588SBarry Smith } 1355d0f46423SBarry Smith ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1356e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 13573a40ed3dSBarry Smith PetscFunctionReturn(0); 1358289bc588SBarry Smith } 1359289bc588SBarry Smith 13604a2ae208SSatish Balay #undef __FUNCT__ 13614a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1362ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1363289bc588SBarry Smith { 1364c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 136563ba0a88SBarry Smith PetscErrorCode ierr; 136667e560aaSBarry Smith 13673a40ed3dSBarry Smith PetscFunctionBegin; 1368b5a2b587SKris Buschelman switch (op) { 1369b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 13704e0d8c25SBarry Smith aij->roworiented = flg; 1371b5a2b587SKris Buschelman break; 1372512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1373b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 13743971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 13754e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 137613fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1377b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1378b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 137977e54ba9SKris Buschelman case MAT_SYMMETRIC: 138077e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 13819a4540c5SBarry Smith case MAT_HERMITIAN: 13829a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 1383600fe468SBarry Smith case MAT_IGNORE_LOWER_TRIANGULAR: 1384290bbb0aSBarry Smith ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 138577e54ba9SKris Buschelman break; 1386b5a2b587SKris Buschelman default: 1387e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 13883a40ed3dSBarry Smith } 13893a40ed3dSBarry Smith PetscFunctionReturn(0); 1390289bc588SBarry Smith } 1391289bc588SBarry Smith 13924a2ae208SSatish Balay #undef __FUNCT__ 13934a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1394dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A) 13956f0a148fSBarry Smith { 1396ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 13976849ba73SBarry Smith PetscErrorCode ierr; 1398d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 13993a40ed3dSBarry Smith 14003a40ed3dSBarry Smith PetscFunctionBegin; 1401a5ce6ee0Svictorle if (lda>m) { 1402d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1403a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1404a5ce6ee0Svictorle } 1405a5ce6ee0Svictorle } else { 1406d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1407a5ce6ee0Svictorle } 14083a40ed3dSBarry Smith PetscFunctionReturn(0); 14096f0a148fSBarry Smith } 14106f0a148fSBarry Smith 14114a2ae208SSatish Balay #undef __FUNCT__ 14124a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 14132b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 14146f0a148fSBarry Smith { 141597b48c8fSBarry Smith PetscErrorCode ierr; 1416ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1417b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 141897b48c8fSBarry Smith PetscScalar *slot,*bb; 141997b48c8fSBarry Smith const PetscScalar *xx; 142055659b69SBarry Smith 14213a40ed3dSBarry Smith PetscFunctionBegin; 1422b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1423b9679d65SBarry Smith for (i=0; i<N; i++) { 1424b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1425b9679d65SBarry Smith if (rows[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested to be zeroed greater than or equal number of rows %D",rows[i],A->rmap->n); 1426b9679d65SBarry Smith } 1427b9679d65SBarry Smith #endif 1428b9679d65SBarry Smith 142997b48c8fSBarry Smith /* fix right hand side if needed */ 143097b48c8fSBarry Smith if (x && b) { 143197b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 143297b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 143397b48c8fSBarry Smith for (i=0; i<N; i++) { 143497b48c8fSBarry Smith bb[rows[i]] = diag*xx[rows[i]]; 143597b48c8fSBarry Smith } 143697b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 143797b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 143897b48c8fSBarry Smith } 143997b48c8fSBarry Smith 14406f0a148fSBarry Smith for (i=0; i<N; i++) { 14416f0a148fSBarry Smith slot = l->v + rows[i]; 1442b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 14436f0a148fSBarry Smith } 1444f4df32b1SMatthew Knepley if (diag != 0.0) { 1445b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 14466f0a148fSBarry Smith for (i=0; i<N; i++) { 1447b9679d65SBarry Smith slot = l->v + (m+1)*rows[i]; 1448f4df32b1SMatthew Knepley *slot = diag; 14496f0a148fSBarry Smith } 14506f0a148fSBarry Smith } 14513a40ed3dSBarry Smith PetscFunctionReturn(0); 14526f0a148fSBarry Smith } 1453557bce09SLois Curfman McInnes 14544a2ae208SSatish Balay #undef __FUNCT__ 14554a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqDense" 1456dfbe8321SBarry Smith PetscErrorCode MatGetArray_SeqDense(Mat A,PetscScalar *array[]) 145764e87e97SBarry Smith { 1458c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 14593a40ed3dSBarry Smith 14603a40ed3dSBarry Smith PetscFunctionBegin; 1461e32f2f54SBarry 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"); 146264e87e97SBarry Smith *array = mat->v; 14633a40ed3dSBarry Smith PetscFunctionReturn(0); 146464e87e97SBarry Smith } 14650754003eSLois Curfman McInnes 14664a2ae208SSatish Balay #undef __FUNCT__ 14674a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense" 1468dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1469ff14e315SSatish Balay { 14703a40ed3dSBarry Smith PetscFunctionBegin; 147109b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 14723a40ed3dSBarry Smith PetscFunctionReturn(0); 1473ff14e315SSatish Balay } 14740754003eSLois Curfman McInnes 14754a2ae208SSatish Balay #undef __FUNCT__ 14764a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 147713f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 14780754003eSLois Curfman McInnes { 1479c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 14806849ba73SBarry Smith PetscErrorCode ierr; 14815d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 14825d0c19d7SBarry Smith const PetscInt *irow,*icol; 148387828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 14840754003eSLois Curfman McInnes Mat newmat; 14850754003eSLois Curfman McInnes 14863a40ed3dSBarry Smith PetscFunctionBegin; 148778b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 148878b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1489e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1490e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 14910754003eSLois Curfman McInnes 1492182d2002SSatish Balay /* Check submatrixcall */ 1493182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 149413f74950SBarry Smith PetscInt n_cols,n_rows; 1495182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 149621a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1497f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1498c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 149921a2c019SBarry Smith } 1500182d2002SSatish Balay newmat = *B; 1501182d2002SSatish Balay } else { 15020754003eSLois Curfman McInnes /* Create and fill new matrix */ 15037adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,&newmat);CHKERRQ(ierr); 1504f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 15057adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 15065c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr); 1507182d2002SSatish Balay } 1508182d2002SSatish Balay 1509182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1510182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1511182d2002SSatish Balay 1512182d2002SSatish Balay for (i=0; i<ncols; i++) { 15136de62eeeSBarry Smith av = v + mat->lda*icol[i]; 1514182d2002SSatish Balay for (j=0; j<nrows; j++) { 1515182d2002SSatish Balay *bv++ = av[irow[j]]; 15160754003eSLois Curfman McInnes } 15170754003eSLois Curfman McInnes } 1518182d2002SSatish Balay 1519182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 15206d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15216d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15220754003eSLois Curfman McInnes 15230754003eSLois Curfman McInnes /* Free work space */ 152478b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 152578b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1526182d2002SSatish Balay *B = newmat; 15273a40ed3dSBarry Smith PetscFunctionReturn(0); 15280754003eSLois Curfman McInnes } 15290754003eSLois Curfman McInnes 15304a2ae208SSatish Balay #undef __FUNCT__ 15314a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 153213f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1533905e6a2fSBarry Smith { 15346849ba73SBarry Smith PetscErrorCode ierr; 153513f74950SBarry Smith PetscInt i; 1536905e6a2fSBarry Smith 15373a40ed3dSBarry Smith PetscFunctionBegin; 1538905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1539b0a32e0cSBarry Smith ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr); 1540905e6a2fSBarry Smith } 1541905e6a2fSBarry Smith 1542905e6a2fSBarry Smith for (i=0; i<n; i++) { 15436a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1544905e6a2fSBarry Smith } 15453a40ed3dSBarry Smith PetscFunctionReturn(0); 1546905e6a2fSBarry Smith } 1547905e6a2fSBarry Smith 15484a2ae208SSatish Balay #undef __FUNCT__ 1549c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1550c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1551c0aa2d19SHong Zhang { 1552c0aa2d19SHong Zhang PetscFunctionBegin; 1553c0aa2d19SHong Zhang PetscFunctionReturn(0); 1554c0aa2d19SHong Zhang } 1555c0aa2d19SHong Zhang 1556c0aa2d19SHong Zhang #undef __FUNCT__ 1557c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1558c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1559c0aa2d19SHong Zhang { 1560c0aa2d19SHong Zhang PetscFunctionBegin; 1561c0aa2d19SHong Zhang PetscFunctionReturn(0); 1562c0aa2d19SHong Zhang } 1563c0aa2d19SHong Zhang 1564c0aa2d19SHong Zhang #undef __FUNCT__ 15654a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1566dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 15674b0e389bSBarry Smith { 15684b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data; 15696849ba73SBarry Smith PetscErrorCode ierr; 1570d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 15713a40ed3dSBarry Smith 15723a40ed3dSBarry Smith PetscFunctionBegin; 157333f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 157433f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1575cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 15763a40ed3dSBarry Smith PetscFunctionReturn(0); 15773a40ed3dSBarry Smith } 1578e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1579a5ce6ee0Svictorle if (lda1>m || lda2>m) { 15800dbb7854Svictorle for (j=0; j<n; j++) { 1581a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1582a5ce6ee0Svictorle } 1583a5ce6ee0Svictorle } else { 1584d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1585a5ce6ee0Svictorle } 1586273d9f13SBarry Smith PetscFunctionReturn(0); 1587273d9f13SBarry Smith } 1588273d9f13SBarry Smith 15894a2ae208SSatish Balay #undef __FUNCT__ 15904994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense" 15914994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A) 1592273d9f13SBarry Smith { 1593dfbe8321SBarry Smith PetscErrorCode ierr; 1594273d9f13SBarry Smith 1595273d9f13SBarry Smith PetscFunctionBegin; 1596273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 15973a40ed3dSBarry Smith PetscFunctionReturn(0); 15984b0e389bSBarry Smith } 15994b0e389bSBarry Smith 1600284134d9SBarry Smith #undef __FUNCT__ 1601ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense" 1602ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1603ba337c44SJed Brown { 1604ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1605ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1606ba337c44SJed Brown PetscScalar *aa = a->v; 1607ba337c44SJed Brown 1608ba337c44SJed Brown PetscFunctionBegin; 1609ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1610ba337c44SJed Brown PetscFunctionReturn(0); 1611ba337c44SJed Brown } 1612ba337c44SJed Brown 1613ba337c44SJed Brown #undef __FUNCT__ 1614ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense" 1615ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1616ba337c44SJed Brown { 1617ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1618ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1619ba337c44SJed Brown PetscScalar *aa = a->v; 1620ba337c44SJed Brown 1621ba337c44SJed Brown PetscFunctionBegin; 1622ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1623ba337c44SJed Brown PetscFunctionReturn(0); 1624ba337c44SJed Brown } 1625ba337c44SJed Brown 1626ba337c44SJed Brown #undef __FUNCT__ 1627ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense" 1628ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 1629ba337c44SJed Brown { 1630ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1631ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1632ba337c44SJed Brown PetscScalar *aa = a->v; 1633ba337c44SJed Brown 1634ba337c44SJed Brown PetscFunctionBegin; 1635ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 1636ba337c44SJed Brown PetscFunctionReturn(0); 1637ba337c44SJed Brown } 1638284134d9SBarry Smith 1639a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1640a9fe9ddaSSatish Balay #undef __FUNCT__ 1641a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1642a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1643a9fe9ddaSSatish Balay { 1644a9fe9ddaSSatish Balay PetscErrorCode ierr; 1645a9fe9ddaSSatish Balay 1646a9fe9ddaSSatish Balay PetscFunctionBegin; 1647a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX){ 1648a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1649a9fe9ddaSSatish Balay } 1650a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1651a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1652a9fe9ddaSSatish Balay } 1653a9fe9ddaSSatish Balay 1654a9fe9ddaSSatish Balay #undef __FUNCT__ 1655a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1656a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1657a9fe9ddaSSatish Balay { 1658ee16a9a1SHong Zhang PetscErrorCode ierr; 1659d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1660ee16a9a1SHong Zhang Mat Cmat; 1661a9fe9ddaSSatish Balay 1662ee16a9a1SHong Zhang PetscFunctionBegin; 1663e32f2f54SBarry 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); 1664ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1665ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1666ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1667ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1668ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 16698cdbd757SHong Zhang Cmat->ops->matmult = MatMatMult_SeqDense_SeqDense; 1670ee16a9a1SHong Zhang *C = Cmat; 1671ee16a9a1SHong Zhang PetscFunctionReturn(0); 1672ee16a9a1SHong Zhang } 1673a9fe9ddaSSatish Balay 167498a3b096SSatish Balay #undef __FUNCT__ 1675a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1676a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1677a9fe9ddaSSatish Balay { 1678a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1679a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1680a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 16810805154bSBarry Smith PetscBLASInt m,n,k; 1682a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1683a9fe9ddaSSatish Balay 1684a9fe9ddaSSatish Balay PetscFunctionBegin; 1685d0f46423SBarry Smith m = PetscBLASIntCast(A->rmap->n); 1686d0f46423SBarry Smith n = PetscBLASIntCast(B->cmap->n); 1687d0f46423SBarry Smith k = PetscBLASIntCast(A->cmap->n); 1688a9fe9ddaSSatish Balay BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1689a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1690a9fe9ddaSSatish Balay } 1691a9fe9ddaSSatish Balay 1692a9fe9ddaSSatish Balay #undef __FUNCT__ 169375648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense" 169475648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1695a9fe9ddaSSatish Balay { 1696a9fe9ddaSSatish Balay PetscErrorCode ierr; 1697a9fe9ddaSSatish Balay 1698a9fe9ddaSSatish Balay PetscFunctionBegin; 1699a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX){ 170075648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1701a9fe9ddaSSatish Balay } 170275648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1703a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1704a9fe9ddaSSatish Balay } 1705a9fe9ddaSSatish Balay 1706a9fe9ddaSSatish Balay #undef __FUNCT__ 170775648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense" 170875648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1709a9fe9ddaSSatish Balay { 1710ee16a9a1SHong Zhang PetscErrorCode ierr; 1711d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1712ee16a9a1SHong Zhang Mat Cmat; 1713a9fe9ddaSSatish Balay 1714ee16a9a1SHong Zhang PetscFunctionBegin; 1715e32f2f54SBarry 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); 1716ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1717ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1718ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1719ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1720ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 1721ee16a9a1SHong Zhang *C = Cmat; 1722ee16a9a1SHong Zhang PetscFunctionReturn(0); 1723ee16a9a1SHong Zhang } 1724a9fe9ddaSSatish Balay 1725a9fe9ddaSSatish Balay #undef __FUNCT__ 172675648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense" 172775648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1728a9fe9ddaSSatish Balay { 1729a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1730a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1731a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 17320805154bSBarry Smith PetscBLASInt m,n,k; 1733a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1734a9fe9ddaSSatish Balay 1735a9fe9ddaSSatish Balay PetscFunctionBegin; 1736d0f46423SBarry Smith m = PetscBLASIntCast(A->cmap->n); 1737d0f46423SBarry Smith n = PetscBLASIntCast(B->cmap->n); 1738d0f46423SBarry Smith k = PetscBLASIntCast(A->rmap->n); 17392fbe02b9SBarry Smith /* 17402fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 17412fbe02b9SBarry Smith */ 1742a9fe9ddaSSatish Balay BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1743a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1744a9fe9ddaSSatish Balay } 1745985db425SBarry Smith 1746985db425SBarry Smith #undef __FUNCT__ 1747985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 1748985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1749985db425SBarry Smith { 1750985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1751985db425SBarry Smith PetscErrorCode ierr; 1752d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1753985db425SBarry Smith PetscScalar *x; 1754985db425SBarry Smith MatScalar *aa = a->v; 1755985db425SBarry Smith 1756985db425SBarry Smith PetscFunctionBegin; 1757e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1758985db425SBarry Smith 1759985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1760985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1761985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1762e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1763985db425SBarry Smith for (i=0; i<m; i++) { 1764985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1765985db425SBarry Smith for (j=1; j<n; j++){ 1766985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1767985db425SBarry Smith } 1768985db425SBarry Smith } 1769985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1770985db425SBarry Smith PetscFunctionReturn(0); 1771985db425SBarry Smith } 1772985db425SBarry Smith 1773985db425SBarry Smith #undef __FUNCT__ 1774985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 1775985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 1776985db425SBarry Smith { 1777985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1778985db425SBarry Smith PetscErrorCode ierr; 1779d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1780985db425SBarry Smith PetscScalar *x; 1781985db425SBarry Smith PetscReal atmp; 1782985db425SBarry Smith MatScalar *aa = a->v; 1783985db425SBarry Smith 1784985db425SBarry Smith PetscFunctionBegin; 1785e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1786985db425SBarry Smith 1787985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1788985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1789985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1790e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1791985db425SBarry Smith for (i=0; i<m; i++) { 17929189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 1793985db425SBarry Smith for (j=1; j<n; j++){ 1794985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 1795985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 1796985db425SBarry Smith } 1797985db425SBarry Smith } 1798985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1799985db425SBarry Smith PetscFunctionReturn(0); 1800985db425SBarry Smith } 1801985db425SBarry Smith 1802985db425SBarry Smith #undef __FUNCT__ 1803985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 1804985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 1805985db425SBarry Smith { 1806985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1807985db425SBarry Smith PetscErrorCode ierr; 1808d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1809985db425SBarry Smith PetscScalar *x; 1810985db425SBarry Smith MatScalar *aa = a->v; 1811985db425SBarry Smith 1812985db425SBarry Smith PetscFunctionBegin; 1813e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1814985db425SBarry Smith 1815985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1816985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1817985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1818e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1819985db425SBarry Smith for (i=0; i<m; i++) { 1820985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1821985db425SBarry Smith for (j=1; j<n; j++){ 1822985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1823985db425SBarry Smith } 1824985db425SBarry Smith } 1825985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1826985db425SBarry Smith PetscFunctionReturn(0); 1827985db425SBarry Smith } 1828985db425SBarry Smith 18298d0534beSBarry Smith #undef __FUNCT__ 18308d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 18318d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 18328d0534beSBarry Smith { 18338d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 18348d0534beSBarry Smith PetscErrorCode ierr; 18358d0534beSBarry Smith PetscScalar *x; 18368d0534beSBarry Smith 18378d0534beSBarry Smith PetscFunctionBegin; 1838e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 18398d0534beSBarry Smith 18408d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1841d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 18428d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 18438d0534beSBarry Smith PetscFunctionReturn(0); 18448d0534beSBarry Smith } 18458d0534beSBarry Smith 18460716a85fSBarry Smith 18470716a85fSBarry Smith #undef __FUNCT__ 18480716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense" 18490716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 18500716a85fSBarry Smith { 18510716a85fSBarry Smith PetscErrorCode ierr; 18520716a85fSBarry Smith PetscInt i,j,m,n; 18530716a85fSBarry Smith PetscScalar *a; 18540716a85fSBarry Smith 18550716a85fSBarry Smith PetscFunctionBegin; 18560716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 18570716a85fSBarry Smith ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); 18580716a85fSBarry Smith ierr = MatGetArray(A,&a);CHKERRQ(ierr); 18590716a85fSBarry Smith if (type == NORM_2) { 18600716a85fSBarry Smith for (i=0; i<n; i++ ){ 18610716a85fSBarry Smith for (j=0; j<m; j++) { 18620716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 18630716a85fSBarry Smith } 18640716a85fSBarry Smith a += m; 18650716a85fSBarry Smith } 18660716a85fSBarry Smith } else if (type == NORM_1) { 18670716a85fSBarry Smith for (i=0; i<n; i++ ){ 18680716a85fSBarry Smith for (j=0; j<m; j++) { 18690716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 18700716a85fSBarry Smith } 18710716a85fSBarry Smith a += m; 18720716a85fSBarry Smith } 18730716a85fSBarry Smith } else if (type == NORM_INFINITY) { 18740716a85fSBarry Smith for (i=0; i<n; i++ ){ 18750716a85fSBarry Smith for (j=0; j<m; j++) { 18760716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 18770716a85fSBarry Smith } 18780716a85fSBarry Smith a += m; 18790716a85fSBarry Smith } 18800716a85fSBarry Smith } else SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Unknown NormType"); 18810716a85fSBarry Smith if (type == NORM_2) { 18828f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 18830716a85fSBarry Smith } 18840716a85fSBarry Smith PetscFunctionReturn(0); 18850716a85fSBarry Smith } 18860716a85fSBarry Smith 1887289bc588SBarry Smith /* -------------------------------------------------------------------*/ 1888a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense, 1889905e6a2fSBarry Smith MatGetRow_SeqDense, 1890905e6a2fSBarry Smith MatRestoreRow_SeqDense, 1891905e6a2fSBarry Smith MatMult_SeqDense, 189297304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 18937c922b88SBarry Smith MatMultTranspose_SeqDense, 18947c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 1895db4efbfdSBarry Smith 0, 1896db4efbfdSBarry Smith 0, 1897db4efbfdSBarry Smith 0, 1898db4efbfdSBarry Smith /*10*/ 0, 1899905e6a2fSBarry Smith MatLUFactor_SeqDense, 1900905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 190141f059aeSBarry Smith MatSOR_SeqDense, 1902ec8511deSBarry Smith MatTranspose_SeqDense, 190397304618SKris Buschelman /*15*/ MatGetInfo_SeqDense, 1904905e6a2fSBarry Smith MatEqual_SeqDense, 1905905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 1906905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 1907905e6a2fSBarry Smith MatNorm_SeqDense, 1908c0aa2d19SHong Zhang /*20*/ MatAssemblyBegin_SeqDense, 1909c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 1910905e6a2fSBarry Smith MatSetOption_SeqDense, 1911905e6a2fSBarry Smith MatZeroEntries_SeqDense, 1912d519adbfSMatthew Knepley /*24*/ MatZeroRows_SeqDense, 1913db4efbfdSBarry Smith 0, 1914db4efbfdSBarry Smith 0, 1915db4efbfdSBarry Smith 0, 1916db4efbfdSBarry Smith 0, 19174994cf47SJed Brown /*29*/ MatSetUp_SeqDense, 1918273d9f13SBarry Smith 0, 1919905e6a2fSBarry Smith 0, 1920905e6a2fSBarry Smith MatGetArray_SeqDense, 1921905e6a2fSBarry Smith MatRestoreArray_SeqDense, 1922d519adbfSMatthew Knepley /*34*/ MatDuplicate_SeqDense, 1923a5ae1ecdSBarry Smith 0, 1924a5ae1ecdSBarry Smith 0, 1925a5ae1ecdSBarry Smith 0, 1926a5ae1ecdSBarry Smith 0, 1927d519adbfSMatthew Knepley /*39*/ MatAXPY_SeqDense, 1928a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 1929a5ae1ecdSBarry Smith 0, 19304b0e389bSBarry Smith MatGetValues_SeqDense, 1931a5ae1ecdSBarry Smith MatCopy_SeqDense, 1932d519adbfSMatthew Knepley /*44*/ MatGetRowMax_SeqDense, 1933a5ae1ecdSBarry Smith MatScale_SeqDense, 1934a5ae1ecdSBarry Smith 0, 1935a5ae1ecdSBarry Smith 0, 1936a5ae1ecdSBarry Smith 0, 1937*f73d5cc4SBarry Smith /*49*/ 0, 1938a5ae1ecdSBarry Smith 0, 1939a5ae1ecdSBarry Smith 0, 1940a5ae1ecdSBarry Smith 0, 1941a5ae1ecdSBarry Smith 0, 1942d519adbfSMatthew Knepley /*54*/ 0, 1943a5ae1ecdSBarry Smith 0, 1944a5ae1ecdSBarry Smith 0, 1945a5ae1ecdSBarry Smith 0, 1946a5ae1ecdSBarry Smith 0, 1947d519adbfSMatthew Knepley /*59*/ 0, 1948e03a110bSBarry Smith MatDestroy_SeqDense, 1949e03a110bSBarry Smith MatView_SeqDense, 1950357abbc8SBarry Smith 0, 195197304618SKris Buschelman 0, 1952d519adbfSMatthew Knepley /*64*/ 0, 195397304618SKris Buschelman 0, 195497304618SKris Buschelman 0, 195597304618SKris Buschelman 0, 195697304618SKris Buschelman 0, 1957d519adbfSMatthew Knepley /*69*/ MatGetRowMaxAbs_SeqDense, 195897304618SKris Buschelman 0, 195997304618SKris Buschelman 0, 196097304618SKris Buschelman 0, 196197304618SKris Buschelman 0, 1962d519adbfSMatthew Knepley /*74*/ 0, 196397304618SKris Buschelman 0, 196497304618SKris Buschelman 0, 196597304618SKris Buschelman 0, 196697304618SKris Buschelman 0, 1967d519adbfSMatthew Knepley /*79*/ 0, 196897304618SKris Buschelman 0, 196997304618SKris Buschelman 0, 197097304618SKris Buschelman 0, 19715bba2384SShri Abhyankar /*83*/ MatLoad_SeqDense, 1972865e5f61SKris Buschelman 0, 19731cbb95d3SBarry Smith MatIsHermitian_SeqDense, 1974865e5f61SKris Buschelman 0, 1975865e5f61SKris Buschelman 0, 1976865e5f61SKris Buschelman 0, 1977d519adbfSMatthew Knepley /*89*/ MatMatMult_SeqDense_SeqDense, 1978a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 1979a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 1980865e5f61SKris Buschelman 0, 1981865e5f61SKris Buschelman 0, 1982d519adbfSMatthew Knepley /*94*/ 0, 19835df89d91SHong Zhang 0, 19845df89d91SHong Zhang 0, 19855df89d91SHong Zhang 0, 1986284134d9SBarry Smith 0, 1987d519adbfSMatthew Knepley /*99*/ 0, 1988284134d9SBarry Smith 0, 1989284134d9SBarry Smith 0, 1990ba337c44SJed Brown MatConjugate_SeqDense, 1991*f73d5cc4SBarry Smith 0, 1992ba337c44SJed Brown /*104*/0, 1993ba337c44SJed Brown MatRealPart_SeqDense, 1994ba337c44SJed Brown MatImaginaryPart_SeqDense, 1995985db425SBarry Smith 0, 1996985db425SBarry Smith 0, 199785e2c93fSHong Zhang /*109*/MatMatSolve_SeqDense, 1998985db425SBarry Smith 0, 19998d0534beSBarry Smith MatGetRowMin_SeqDense, 2000aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 2001aabbc4fbSShri Abhyankar 0, 2002aabbc4fbSShri Abhyankar /*114*/0, 2003aabbc4fbSShri Abhyankar 0, 2004aabbc4fbSShri Abhyankar 0, 2005aabbc4fbSShri Abhyankar 0, 2006aabbc4fbSShri Abhyankar 0, 2007aabbc4fbSShri Abhyankar /*119*/0, 2008aabbc4fbSShri Abhyankar 0, 2009aabbc4fbSShri Abhyankar 0, 20100716a85fSBarry Smith 0, 20110716a85fSBarry Smith 0, 20120716a85fSBarry Smith /*124*/0, 20135df89d91SHong Zhang MatGetColumnNorms_SeqDense, 20145df89d91SHong Zhang 0, 20155df89d91SHong Zhang 0, 20165df89d91SHong Zhang 0, 20175df89d91SHong Zhang /*129*/0, 201875648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 201975648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 202075648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 2021985db425SBarry Smith }; 202290ace30eSBarry Smith 20234a2ae208SSatish Balay #undef __FUNCT__ 20244a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 20254b828684SBarry Smith /*@C 2026fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2027d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2028d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2029289bc588SBarry Smith 2030db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2031db81eaa0SLois Curfman McInnes 203220563c6bSBarry Smith Input Parameters: 2033db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 20340c775827SLois Curfman McInnes . m - number of rows 203518f449edSLois Curfman McInnes . n - number of columns 2036c0235b3cSMatthew Knepley - data - optional location of matrix data in column major order. Set data=PETSC_NULL for PETSc 2037dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 203820563c6bSBarry Smith 203920563c6bSBarry Smith Output Parameter: 204044cd7ae7SLois Curfman McInnes . A - the matrix 204120563c6bSBarry Smith 2042b259b22eSLois Curfman McInnes Notes: 204318f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 204418f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 2045b4fd4287SBarry Smith set data=PETSC_NULL. 204618f449edSLois Curfman McInnes 2047027ccd11SLois Curfman McInnes Level: intermediate 2048027ccd11SLois Curfman McInnes 2049dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 2050d65003e9SLois Curfman McInnes 205169b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 205220563c6bSBarry Smith @*/ 20537087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2054289bc588SBarry Smith { 2055dfbe8321SBarry Smith PetscErrorCode ierr; 20563b2fbd54SBarry Smith 20573a40ed3dSBarry Smith PetscFunctionBegin; 2058f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2059f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2060273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2061273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2062273d9f13SBarry Smith PetscFunctionReturn(0); 2063273d9f13SBarry Smith } 2064273d9f13SBarry Smith 20654a2ae208SSatish Balay #undef __FUNCT__ 2066afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 2067273d9f13SBarry Smith /*@C 2068273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2069273d9f13SBarry Smith 2070273d9f13SBarry Smith Collective on MPI_Comm 2071273d9f13SBarry Smith 2072273d9f13SBarry Smith Input Parameters: 2073273d9f13SBarry Smith + A - the matrix 2074273d9f13SBarry Smith - data - the array (or PETSC_NULL) 2075273d9f13SBarry Smith 2076273d9f13SBarry Smith Notes: 2077273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2078273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2079284134d9SBarry Smith need not call this routine. 2080273d9f13SBarry Smith 2081273d9f13SBarry Smith Level: intermediate 2082273d9f13SBarry Smith 2083273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2084273d9f13SBarry Smith 208569b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2086867c911aSBarry Smith 2087273d9f13SBarry Smith @*/ 20887087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2089273d9f13SBarry Smith { 20904ac538c5SBarry Smith PetscErrorCode ierr; 2091a23d5eceSKris Buschelman 2092a23d5eceSKris Buschelman PetscFunctionBegin; 20934ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2094a23d5eceSKris Buschelman PetscFunctionReturn(0); 2095a23d5eceSKris Buschelman } 2096a23d5eceSKris Buschelman 2097a23d5eceSKris Buschelman EXTERN_C_BEGIN 2098a23d5eceSKris Buschelman #undef __FUNCT__ 2099afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 21007087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2101a23d5eceSKris Buschelman { 2102273d9f13SBarry Smith Mat_SeqDense *b; 2103dfbe8321SBarry Smith PetscErrorCode ierr; 2104273d9f13SBarry Smith 2105273d9f13SBarry Smith PetscFunctionBegin; 2106273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2107a868139aSShri Abhyankar 210834ef9618SShri Abhyankar ierr = PetscLayoutSetBlockSize(B->rmap,1);CHKERRQ(ierr); 210934ef9618SShri Abhyankar ierr = PetscLayoutSetBlockSize(B->cmap,1);CHKERRQ(ierr); 211034ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 211134ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 211234ef9618SShri Abhyankar 2113273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 211486d161a7SShri Abhyankar b->Mmax = B->rmap->n; 211586d161a7SShri Abhyankar b->Nmax = B->cmap->n; 211686d161a7SShri Abhyankar if(b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 211786d161a7SShri Abhyankar 21189e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 21199e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 21205afd5e0cSBarry Smith ierr = PetscMalloc(b->lda*b->Nmax*sizeof(PetscScalar),&b->v);CHKERRQ(ierr); 2121284134d9SBarry Smith ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 2122284134d9SBarry Smith ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 21239e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2124273d9f13SBarry Smith } else { /* user-allocated storage */ 21259e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2126273d9f13SBarry Smith b->v = data; 2127273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2128273d9f13SBarry Smith } 21290450473dSBarry Smith B->assembled = PETSC_TRUE; 2130273d9f13SBarry Smith PetscFunctionReturn(0); 2131273d9f13SBarry Smith } 2132a23d5eceSKris Buschelman EXTERN_C_END 2133273d9f13SBarry Smith 21341b807ce4Svictorle #undef __FUNCT__ 21351b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 21361b807ce4Svictorle /*@C 21371b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 21381b807ce4Svictorle 21391b807ce4Svictorle Input parameter: 21401b807ce4Svictorle + A - the matrix 21411b807ce4Svictorle - lda - the leading dimension 21421b807ce4Svictorle 21431b807ce4Svictorle Notes: 2144867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 21451b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 21461b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 21471b807ce4Svictorle 21481b807ce4Svictorle Level: intermediate 21491b807ce4Svictorle 21501b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 21511b807ce4Svictorle 2152284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2153867c911aSBarry Smith 21541b807ce4Svictorle @*/ 21557087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 21561b807ce4Svictorle { 21571b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 215821a2c019SBarry Smith 21591b807ce4Svictorle PetscFunctionBegin; 2160e32f2f54SBarry 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); 21611b807ce4Svictorle b->lda = lda; 216221a2c019SBarry Smith b->changelda = PETSC_FALSE; 216321a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 21641b807ce4Svictorle PetscFunctionReturn(0); 21651b807ce4Svictorle } 21661b807ce4Svictorle 21670bad9183SKris Buschelman /*MC 2168fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 21690bad9183SKris Buschelman 21700bad9183SKris Buschelman Options Database Keys: 21710bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 21720bad9183SKris Buschelman 21730bad9183SKris Buschelman Level: beginner 21740bad9183SKris Buschelman 217589665df3SBarry Smith .seealso: MatCreateSeqDense() 217689665df3SBarry Smith 21770bad9183SKris Buschelman M*/ 21780bad9183SKris Buschelman 2179273d9f13SBarry Smith EXTERN_C_BEGIN 21804a2ae208SSatish Balay #undef __FUNCT__ 21814a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 21827087cfbeSBarry Smith PetscErrorCode MatCreate_SeqDense(Mat B) 2183273d9f13SBarry Smith { 2184273d9f13SBarry Smith Mat_SeqDense *b; 2185dfbe8321SBarry Smith PetscErrorCode ierr; 21867c334f02SBarry Smith PetscMPIInt size; 2187273d9f13SBarry Smith 2188273d9f13SBarry Smith PetscFunctionBegin; 21897adad957SLisandro Dalcin ierr = MPI_Comm_size(((PetscObject)B)->comm,&size);CHKERRQ(ierr); 2190e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 219155659b69SBarry Smith 219238f2d2fdSLisandro Dalcin ierr = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr); 2193549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 219444cd7ae7SLois Curfman McInnes B->data = (void*)b; 219518f449edSLois Curfman McInnes 219644cd7ae7SLois Curfman McInnes b->pivots = 0; 2197273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2198273d9f13SBarry Smith b->v = 0; 219921a2c019SBarry Smith b->changelda = PETSC_FALSE; 22004e220ebcSLois Curfman McInnes 2201b24902e0SBarry Smith 22026a63e612SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqdense_seqaij_C","MatConvert_SeqDense_SeqAIJ",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 2203ec1065edSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_petsc_C", 2204b24902e0SBarry Smith "MatGetFactor_seqdense_petsc", 2205b24902e0SBarry Smith MatGetFactor_seqdense_petsc);CHKERRQ(ierr); 2206a23d5eceSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C", 2207a23d5eceSKris Buschelman "MatSeqDenseSetPreallocation_SeqDense", 2208a23d5eceSKris Buschelman MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 22092356f84bSDmitry Karpeev 22104ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqaij_seqdense_C", 22114ae313f4SHong Zhang "MatMatMult_SeqAIJ_SeqDense", 22124ae313f4SHong Zhang MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 22132356f84bSDmitry Karpeev 2214c0c8ee5eSDmitry Karpeev 22154ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C", 22164ae313f4SHong Zhang "MatMatMultSymbolic_SeqAIJ_SeqDense", 22174ae313f4SHong Zhang MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 22184ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C", 22194ae313f4SHong Zhang "MatMatMultNumeric_SeqAIJ_SeqDense", 22204ae313f4SHong Zhang MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 222117667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 22223a40ed3dSBarry Smith PetscFunctionReturn(0); 2223289bc588SBarry Smith } 2224273d9f13SBarry Smith EXTERN_C_END 2225