1be1d678aSKris Buschelman 267e560aaSBarry Smith /* 367e560aaSBarry Smith Defines the basic matrix operations for sequential dense. 467e560aaSBarry Smith */ 5289bc588SBarry Smith 6dec5eb66SMatthew G Knepley #include <../src/mat/impls/dense/seq/dense.h> /*I "petscmat.h" I*/ 7c6db04a5SJed Brown #include <petscblaslapack.h> 8289bc588SBarry Smith 96a63e612SBarry Smith #include <../src/mat/impls/aij/seq/aij.h> 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; 59*c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr); 60*c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr); 61*c5df96a5SBarry Smith ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr); 62*c5df96a5SBarry Smith ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr); 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; 101*c5df96a5SBarry Smith PetscBLASInt one = 1,j,nz,lda; 10280cd9d93SLois Curfman McInnes 1033a40ed3dSBarry Smith PetscFunctionBegin; 104*c5df96a5SBarry Smith ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr); 105d0f46423SBarry Smith if (lda>A->rmap->n) { 106*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr); 107d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 108f4df32b1SMatthew Knepley BLASscal_(&nz,&oalpha,a->v+j*lda,&one); 109a5ce6ee0Svictorle } 110a5ce6ee0Svictorle } else { 111*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr); 112f4df32b1SMatthew Knepley BLASscal_(&nz,&oalpha,a->v,&one); 113a5ce6ee0Svictorle } 114efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 1153a40ed3dSBarry Smith PetscFunctionReturn(0); 11680cd9d93SLois Curfman McInnes } 11780cd9d93SLois Curfman McInnes 1181cbb95d3SBarry Smith #undef __FUNCT__ 1191cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense" 120ace3abfcSBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 1211cbb95d3SBarry Smith { 1221cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 123d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,N; 1241cbb95d3SBarry Smith PetscScalar *v = a->v; 1251cbb95d3SBarry Smith 1261cbb95d3SBarry Smith PetscFunctionBegin; 1271cbb95d3SBarry Smith *fl = PETSC_FALSE; 128d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 1291cbb95d3SBarry Smith N = a->lda; 1301cbb95d3SBarry Smith 1311cbb95d3SBarry Smith for (i=0; i<m; i++) { 1321cbb95d3SBarry Smith for (j=i+1; j<m; j++) { 1331cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 1341cbb95d3SBarry Smith } 1351cbb95d3SBarry Smith } 1361cbb95d3SBarry Smith *fl = PETSC_TRUE; 1371cbb95d3SBarry Smith PetscFunctionReturn(0); 1381cbb95d3SBarry Smith } 1391cbb95d3SBarry Smith 140b24902e0SBarry Smith #undef __FUNCT__ 141b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense" 142719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 143b24902e0SBarry Smith { 144b24902e0SBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 145b24902e0SBarry Smith PetscErrorCode ierr; 146b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 147b24902e0SBarry Smith 148b24902e0SBarry Smith PetscFunctionBegin; 149aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr); 150aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr); 151719d5645SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,PETSC_NULL);CHKERRQ(ierr); 152b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 153b24902e0SBarry Smith l = (Mat_SeqDense*)newi->data; 154d0f46423SBarry Smith if (lda>A->rmap->n) { 155d0f46423SBarry Smith m = A->rmap->n; 156d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 157b24902e0SBarry Smith ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 158b24902e0SBarry Smith } 159b24902e0SBarry Smith } else { 160d0f46423SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 161b24902e0SBarry Smith } 162b24902e0SBarry Smith } 163b24902e0SBarry Smith newi->assembled = PETSC_TRUE; 164b24902e0SBarry Smith PetscFunctionReturn(0); 165b24902e0SBarry Smith } 166b24902e0SBarry Smith 1674a2ae208SSatish Balay #undef __FUNCT__ 1684a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense" 169dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 17002cad45dSBarry Smith { 1716849ba73SBarry Smith PetscErrorCode ierr; 17202cad45dSBarry Smith 1733a40ed3dSBarry Smith PetscFunctionBegin; 1745c9eb25fSBarry Smith ierr = MatCreate(((PetscObject)A)->comm,newmat);CHKERRQ(ierr); 175d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1765c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 177719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 178b24902e0SBarry Smith PetscFunctionReturn(0); 179b24902e0SBarry Smith } 180b24902e0SBarry Smith 1816ee01492SSatish Balay 1820481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*); 183719d5645SBarry Smith 1844a2ae208SSatish Balay #undef __FUNCT__ 1854a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense" 1860481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 187289bc588SBarry Smith { 1884482741eSBarry Smith MatFactorInfo info; 189a093e273SMatthew Knepley PetscErrorCode ierr; 1903a40ed3dSBarry Smith 1913a40ed3dSBarry Smith PetscFunctionBegin; 192c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 193719d5645SBarry Smith ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr); 1943a40ed3dSBarry Smith PetscFunctionReturn(0); 195289bc588SBarry Smith } 1966ee01492SSatish Balay 1970b4b3355SBarry Smith #undef __FUNCT__ 1984a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense" 199dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 200289bc588SBarry Smith { 201c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 2026849ba73SBarry Smith PetscErrorCode ierr; 20387828ca2SBarry Smith PetscScalar *x,*y; 204*c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 20567e560aaSBarry Smith 2063a40ed3dSBarry Smith PetscFunctionBegin; 207*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 2081ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2091ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 210d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 211d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 212ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 213e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 214ae7cfcebSSatish Balay #else 21571044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 216e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 217ae7cfcebSSatish Balay #endif 218d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 219ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 220e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 221ae7cfcebSSatish Balay #else 22271044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 223e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 224ae7cfcebSSatish Balay #endif 225289bc588SBarry Smith } 226e32f2f54SBarry Smith else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 2271ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2281ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 229dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 2303a40ed3dSBarry Smith PetscFunctionReturn(0); 231289bc588SBarry Smith } 2326ee01492SSatish Balay 2334a2ae208SSatish Balay #undef __FUNCT__ 23485e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense" 23585e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 23685e2c93fSHong Zhang { 23785e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 23885e2c93fSHong Zhang PetscErrorCode ierr; 23985e2c93fSHong Zhang PetscScalar *b,*x; 240efb80c78SLisandro Dalcin PetscInt n; 241783b601eSJed Brown PetscBLASInt nrhs,info,m; 242bda8bf91SBarry Smith PetscBool flg; 24385e2c93fSHong Zhang 24485e2c93fSHong Zhang PetscFunctionBegin; 245*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 246251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr); 247bda8bf91SBarry Smith if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix"); 248251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,PETSC_NULL);CHKERRQ(ierr); 249bda8bf91SBarry Smith if (!flg) SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix"); 250bda8bf91SBarry Smith 251efb80c78SLisandro Dalcin ierr = MatGetSize(B,PETSC_NULL,&n);CHKERRQ(ierr); 252*c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr); 2538c778c55SBarry Smith ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr); 2548c778c55SBarry Smith ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr); 25585e2c93fSHong Zhang 256f272c775SHong Zhang ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr); 25785e2c93fSHong Zhang 25885e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 25985e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS) 26085e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 26185e2c93fSHong Zhang #else 26285e2c93fSHong Zhang LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info); 26385e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 26485e2c93fSHong Zhang #endif 26585e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 26685e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS) 26785e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 26885e2c93fSHong Zhang #else 26985e2c93fSHong Zhang LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info); 27085e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 27185e2c93fSHong Zhang #endif 27285e2c93fSHong Zhang } 27385e2c93fSHong Zhang else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 27485e2c93fSHong Zhang 2758c778c55SBarry Smith ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr); 2768c778c55SBarry Smith ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr); 27785e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 27885e2c93fSHong Zhang PetscFunctionReturn(0); 27985e2c93fSHong Zhang } 28085e2c93fSHong Zhang 28185e2c93fSHong Zhang #undef __FUNCT__ 2824a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense" 283dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 284da3a660dSBarry Smith { 285c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 286dfbe8321SBarry Smith PetscErrorCode ierr; 28787828ca2SBarry Smith PetscScalar *x,*y; 288*c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 28967e560aaSBarry Smith 2903a40ed3dSBarry Smith PetscFunctionBegin; 291*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 2921ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2931ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 294d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 295752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 296da3a660dSBarry Smith if (mat->pivots) { 297ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 298e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 299ae7cfcebSSatish Balay #else 30071044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 301e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 302ae7cfcebSSatish Balay #endif 3037a97a34bSBarry Smith } else { 304ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 305e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 306ae7cfcebSSatish Balay #else 30771044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 308e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 309ae7cfcebSSatish Balay #endif 310da3a660dSBarry Smith } 3111ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3121ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 313dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 3143a40ed3dSBarry Smith PetscFunctionReturn(0); 315da3a660dSBarry Smith } 3166ee01492SSatish Balay 3174a2ae208SSatish Balay #undef __FUNCT__ 3184a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense" 319dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 320da3a660dSBarry Smith { 321c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 322dfbe8321SBarry Smith PetscErrorCode ierr; 32387828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 324da3a660dSBarry Smith Vec tmp = 0; 325*c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 32667e560aaSBarry Smith 3273a40ed3dSBarry Smith PetscFunctionBegin; 328*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 3291ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 3301ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 331d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 332da3a660dSBarry Smith if (yy == zz) { 33378b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 33452e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 33578b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 336da3a660dSBarry Smith } 337d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 338752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 339da3a660dSBarry Smith if (mat->pivots) { 340ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 341e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 342ae7cfcebSSatish Balay #else 34371044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 344e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 345ae7cfcebSSatish Balay #endif 346a8c6a408SBarry Smith } else { 347ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 348e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 349ae7cfcebSSatish Balay #else 35071044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 351e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 352ae7cfcebSSatish Balay #endif 353da3a660dSBarry Smith } 3546bf464f9SBarry Smith if (tmp) { 3556bf464f9SBarry Smith ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 3566bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 3576bf464f9SBarry Smith } else { 3586bf464f9SBarry Smith ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 3596bf464f9SBarry Smith } 3601ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3611ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 362dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 3633a40ed3dSBarry Smith PetscFunctionReturn(0); 364da3a660dSBarry Smith } 36567e560aaSBarry Smith 3664a2ae208SSatish Balay #undef __FUNCT__ 3674a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense" 368dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 369da3a660dSBarry Smith { 370c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 3716849ba73SBarry Smith PetscErrorCode ierr; 37287828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 373da3a660dSBarry Smith Vec tmp; 374*c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 37567e560aaSBarry Smith 3763a40ed3dSBarry Smith PetscFunctionBegin; 377*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 378d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 3791ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 3801ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 381da3a660dSBarry Smith if (yy == zz) { 38278b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 38352e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 38478b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 385da3a660dSBarry Smith } 386d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 387752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 388da3a660dSBarry Smith if (mat->pivots) { 389ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 390e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 391ae7cfcebSSatish Balay #else 39271044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 393e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 394ae7cfcebSSatish Balay #endif 3953a40ed3dSBarry Smith } else { 396ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 397e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 398ae7cfcebSSatish Balay #else 39971044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 400e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 401ae7cfcebSSatish Balay #endif 402da3a660dSBarry Smith } 40390f02eecSBarry Smith if (tmp) { 4042dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 4056bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 4063a40ed3dSBarry Smith } else { 4072dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 40890f02eecSBarry Smith } 4091ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 4101ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 411dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 4123a40ed3dSBarry Smith PetscFunctionReturn(0); 413da3a660dSBarry Smith } 414db4efbfdSBarry Smith 415db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 416db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 417db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 418db4efbfdSBarry Smith #undef __FUNCT__ 419db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense" 4200481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 421db4efbfdSBarry Smith { 422db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 423db4efbfdSBarry Smith PetscFunctionBegin; 424e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 425db4efbfdSBarry Smith #else 426db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 427db4efbfdSBarry Smith PetscErrorCode ierr; 428db4efbfdSBarry Smith PetscBLASInt n,m,info; 429db4efbfdSBarry Smith 430db4efbfdSBarry Smith PetscFunctionBegin; 431*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 432*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 433db4efbfdSBarry Smith if (!mat->pivots) { 434db4efbfdSBarry Smith ierr = PetscMalloc((A->rmap->n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr); 435db4efbfdSBarry Smith ierr = PetscLogObjectMemory(A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 436db4efbfdSBarry Smith } 437db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 4388e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 439db4efbfdSBarry Smith LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info); 4408e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 4418e57ea43SSatish Balay 442e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 443e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 444db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 445db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 446db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 447db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 448d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 449db4efbfdSBarry Smith 450dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 451db4efbfdSBarry Smith #endif 452db4efbfdSBarry Smith PetscFunctionReturn(0); 453db4efbfdSBarry Smith } 454db4efbfdSBarry Smith 455db4efbfdSBarry Smith #undef __FUNCT__ 456db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense" 4570481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 458db4efbfdSBarry Smith { 459db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 460db4efbfdSBarry Smith PetscFunctionBegin; 461e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 462db4efbfdSBarry Smith #else 463db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 464db4efbfdSBarry Smith PetscErrorCode ierr; 465*c5df96a5SBarry Smith PetscBLASInt info,n; 466db4efbfdSBarry Smith 467db4efbfdSBarry Smith PetscFunctionBegin; 468*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 469db4efbfdSBarry Smith ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 470db4efbfdSBarry Smith 471db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 472db4efbfdSBarry Smith LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info); 473e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 474db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 475db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 476db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 477db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 478d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 479dc0b31edSSatish Balay ierr = PetscLogFlops((A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 480db4efbfdSBarry Smith #endif 481db4efbfdSBarry Smith PetscFunctionReturn(0); 482db4efbfdSBarry Smith } 483db4efbfdSBarry Smith 484db4efbfdSBarry Smith 485db4efbfdSBarry Smith #undef __FUNCT__ 486db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense" 4870481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 488db4efbfdSBarry Smith { 489db4efbfdSBarry Smith PetscErrorCode ierr; 490db4efbfdSBarry Smith MatFactorInfo info; 491db4efbfdSBarry Smith 492db4efbfdSBarry Smith PetscFunctionBegin; 493db4efbfdSBarry Smith info.fill = 1.0; 494c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 495719d5645SBarry Smith ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr); 496db4efbfdSBarry Smith PetscFunctionReturn(0); 497db4efbfdSBarry Smith } 498db4efbfdSBarry Smith 499db4efbfdSBarry Smith #undef __FUNCT__ 500db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense" 5010481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 502db4efbfdSBarry Smith { 503db4efbfdSBarry Smith PetscFunctionBegin; 504c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 5051bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 506719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 507db4efbfdSBarry Smith PetscFunctionReturn(0); 508db4efbfdSBarry Smith } 509db4efbfdSBarry Smith 510db4efbfdSBarry Smith #undef __FUNCT__ 511db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense" 5120481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 513db4efbfdSBarry Smith { 514db4efbfdSBarry Smith PetscFunctionBegin; 515b66fe19dSMatthew G Knepley fact->preallocated = PETSC_TRUE; 516c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 517719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 518db4efbfdSBarry Smith PetscFunctionReturn(0); 519db4efbfdSBarry Smith } 520db4efbfdSBarry Smith 521bb5747d9SMatthew Knepley EXTERN_C_BEGIN 522db4efbfdSBarry Smith #undef __FUNCT__ 523db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc" 524db4efbfdSBarry Smith PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 525db4efbfdSBarry Smith { 526db4efbfdSBarry Smith PetscErrorCode ierr; 527db4efbfdSBarry Smith 528db4efbfdSBarry Smith PetscFunctionBegin; 529db4efbfdSBarry Smith ierr = MatCreate(((PetscObject)A)->comm,fact);CHKERRQ(ierr); 530db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 531db4efbfdSBarry Smith ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr); 532db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU) { 533db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 534db4efbfdSBarry Smith } else { 535db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 536db4efbfdSBarry Smith } 537d5f3da31SBarry Smith (*fact)->factortype = ftype; 538db4efbfdSBarry Smith PetscFunctionReturn(0); 539db4efbfdSBarry Smith } 540bb5747d9SMatthew Knepley EXTERN_C_END 541db4efbfdSBarry Smith 542289bc588SBarry Smith /* ------------------------------------------------------------------*/ 5434a2ae208SSatish Balay #undef __FUNCT__ 54441f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense" 54541f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 546289bc588SBarry Smith { 547c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 54887828ca2SBarry Smith PetscScalar *x,*b,*v = mat->v,zero = 0.0,xt; 549dfbe8321SBarry Smith PetscErrorCode ierr; 550d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 551*c5df96a5SBarry Smith PetscBLASInt o = 1,bm; 552289bc588SBarry Smith 5533a40ed3dSBarry Smith PetscFunctionBegin; 554*c5df96a5SBarry Smith ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr); 555289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 55671044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 5572dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 558289bc588SBarry Smith } 5591ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5601ebc52fbSHong Zhang ierr = VecGetArray(bb,&b);CHKERRQ(ierr); 561b965ef7fSBarry Smith its = its*lits; 562e32f2f54SBarry 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); 563289bc588SBarry Smith while (its--) { 564fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 565289bc588SBarry Smith for (i=0; i<m; i++) { 56671044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 56755a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 568289bc588SBarry Smith } 569289bc588SBarry Smith } 570fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 571289bc588SBarry Smith for (i=m-1; i>=0; i--) { 57271044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 57355a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 574289bc588SBarry Smith } 575289bc588SBarry Smith } 576289bc588SBarry Smith } 5771ebc52fbSHong Zhang ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr); 5781ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5793a40ed3dSBarry Smith PetscFunctionReturn(0); 580289bc588SBarry Smith } 581289bc588SBarry Smith 582289bc588SBarry Smith /* -----------------------------------------------------------------*/ 5834a2ae208SSatish Balay #undef __FUNCT__ 5844a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense" 585dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 586289bc588SBarry Smith { 587c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 58887828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 589dfbe8321SBarry Smith PetscErrorCode ierr; 5900805154bSBarry Smith PetscBLASInt m, n,_One=1; 591ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 5923a40ed3dSBarry Smith 5933a40ed3dSBarry Smith PetscFunctionBegin; 594*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 595*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 596d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5971ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5981ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 59971044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One); 6001ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6011ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 602dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 6033a40ed3dSBarry Smith PetscFunctionReturn(0); 604289bc588SBarry Smith } 605800995b7SMatthew Knepley 6064a2ae208SSatish Balay #undef __FUNCT__ 6074a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense" 608dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 609289bc588SBarry Smith { 610c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 61187828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0; 612dfbe8321SBarry Smith PetscErrorCode ierr; 6130805154bSBarry Smith PetscBLASInt m, n, _One=1; 6143a40ed3dSBarry Smith 6153a40ed3dSBarry Smith PetscFunctionBegin; 616*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 617*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 618d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 6191ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 6201ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 62171044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One); 6221ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6231ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 624dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 6253a40ed3dSBarry Smith PetscFunctionReturn(0); 626289bc588SBarry Smith } 6276ee01492SSatish Balay 6284a2ae208SSatish Balay #undef __FUNCT__ 6294a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense" 630dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 631289bc588SBarry Smith { 632c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 63387828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0; 634dfbe8321SBarry Smith PetscErrorCode ierr; 6350805154bSBarry Smith PetscBLASInt m, n, _One=1; 6363a40ed3dSBarry Smith 6373a40ed3dSBarry Smith PetscFunctionBegin; 638*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 639*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 640d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 641600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 6421ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 6431ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 64471044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 6451ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6461ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 647dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 6483a40ed3dSBarry Smith PetscFunctionReturn(0); 649289bc588SBarry Smith } 6506ee01492SSatish Balay 6514a2ae208SSatish Balay #undef __FUNCT__ 6524a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense" 653dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 654289bc588SBarry Smith { 655c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 65687828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 657dfbe8321SBarry Smith PetscErrorCode ierr; 6580805154bSBarry Smith PetscBLASInt m, n, _One=1; 65987828ca2SBarry Smith PetscScalar _DOne=1.0; 6603a40ed3dSBarry Smith 6613a40ed3dSBarry Smith PetscFunctionBegin; 662*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 663*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 664d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 665600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 6661ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 6671ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 66871044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 6691ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6701ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 671dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 6723a40ed3dSBarry Smith PetscFunctionReturn(0); 673289bc588SBarry Smith } 674289bc588SBarry Smith 675289bc588SBarry Smith /* -----------------------------------------------------------------*/ 6764a2ae208SSatish Balay #undef __FUNCT__ 6774a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense" 67813f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 679289bc588SBarry Smith { 680c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 68187828ca2SBarry Smith PetscScalar *v; 6826849ba73SBarry Smith PetscErrorCode ierr; 68313f74950SBarry Smith PetscInt i; 68467e560aaSBarry Smith 6853a40ed3dSBarry Smith PetscFunctionBegin; 686d0f46423SBarry Smith *ncols = A->cmap->n; 687289bc588SBarry Smith if (cols) { 688d0f46423SBarry Smith ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr); 689d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 690289bc588SBarry Smith } 691289bc588SBarry Smith if (vals) { 692d0f46423SBarry Smith ierr = PetscMalloc((A->cmap->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr); 693289bc588SBarry Smith v = mat->v + row; 694d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 695289bc588SBarry Smith } 6963a40ed3dSBarry Smith PetscFunctionReturn(0); 697289bc588SBarry Smith } 6986ee01492SSatish Balay 6994a2ae208SSatish Balay #undef __FUNCT__ 7004a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense" 70113f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 702289bc588SBarry Smith { 703dfbe8321SBarry Smith PetscErrorCode ierr; 7046e111a19SKarl Rupp 705606d414cSSatish Balay PetscFunctionBegin; 706606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 707606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 7083a40ed3dSBarry Smith PetscFunctionReturn(0); 709289bc588SBarry Smith } 710289bc588SBarry Smith /* ----------------------------------------------------------------*/ 7114a2ae208SSatish Balay #undef __FUNCT__ 7124a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense" 71313f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 714289bc588SBarry Smith { 715c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 71613f74950SBarry Smith PetscInt i,j,idx=0; 717d6dfbf8fSBarry Smith 7183a40ed3dSBarry Smith PetscFunctionBegin; 71971fd2e92SBarry Smith if (v) PetscValidScalarPointer(v,6); 720289bc588SBarry Smith if (!mat->roworiented) { 721dbb450caSBarry Smith if (addv == INSERT_VALUES) { 722289bc588SBarry Smith for (j=0; j<n; j++) { 723cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 7242515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 725e32f2f54SBarry 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); 72658804f6dSBarry Smith #endif 727289bc588SBarry Smith for (i=0; i<m; i++) { 728cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 7292515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 730e32f2f54SBarry 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); 73158804f6dSBarry Smith #endif 732cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 733289bc588SBarry Smith } 734289bc588SBarry Smith } 7353a40ed3dSBarry Smith } else { 736289bc588SBarry Smith for (j=0; j<n; j++) { 737cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 7382515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 739e32f2f54SBarry 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); 74058804f6dSBarry Smith #endif 741289bc588SBarry Smith for (i=0; i<m; i++) { 742cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 7432515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 744e32f2f54SBarry 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); 74558804f6dSBarry Smith #endif 746cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 747289bc588SBarry Smith } 748289bc588SBarry Smith } 749289bc588SBarry Smith } 7503a40ed3dSBarry Smith } else { 751dbb450caSBarry Smith if (addv == INSERT_VALUES) { 752e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 753cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 7542515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 755e32f2f54SBarry 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); 75658804f6dSBarry Smith #endif 757e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 758cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 7592515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 760e32f2f54SBarry 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); 76158804f6dSBarry Smith #endif 762cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 763e8d4e0b9SBarry Smith } 764e8d4e0b9SBarry Smith } 7653a40ed3dSBarry Smith } else { 766289bc588SBarry Smith for (i=0; i<m; i++) { 767cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 7682515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 769e32f2f54SBarry 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); 77058804f6dSBarry Smith #endif 771289bc588SBarry Smith for (j=0; j<n; j++) { 772cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 7732515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 774e32f2f54SBarry 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); 77558804f6dSBarry Smith #endif 776cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 777289bc588SBarry Smith } 778289bc588SBarry Smith } 779289bc588SBarry Smith } 780e8d4e0b9SBarry Smith } 7813a40ed3dSBarry Smith PetscFunctionReturn(0); 782289bc588SBarry Smith } 783e8d4e0b9SBarry Smith 7844a2ae208SSatish Balay #undef __FUNCT__ 7854a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense" 78613f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 787ae80bb75SLois Curfman McInnes { 788ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 78913f74950SBarry Smith PetscInt i,j; 790ae80bb75SLois Curfman McInnes 7913a40ed3dSBarry Smith PetscFunctionBegin; 792ae80bb75SLois Curfman McInnes /* row-oriented output */ 793ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 79497e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 795e32f2f54SBarry 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); 796ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 7976f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 798e32f2f54SBarry 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); 79997e567efSBarry Smith *v++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 800ae80bb75SLois Curfman McInnes } 801ae80bb75SLois Curfman McInnes } 8023a40ed3dSBarry Smith PetscFunctionReturn(0); 803ae80bb75SLois Curfman McInnes } 804ae80bb75SLois Curfman McInnes 805289bc588SBarry Smith /* -----------------------------------------------------------------*/ 806289bc588SBarry Smith 8074a2ae208SSatish Balay #undef __FUNCT__ 8085bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense" 809112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer) 810aabbc4fbSShri Abhyankar { 811aabbc4fbSShri Abhyankar Mat_SeqDense *a; 812aabbc4fbSShri Abhyankar PetscErrorCode ierr; 813aabbc4fbSShri Abhyankar PetscInt *scols,i,j,nz,header[4]; 814aabbc4fbSShri Abhyankar int fd; 815aabbc4fbSShri Abhyankar PetscMPIInt size; 816aabbc4fbSShri Abhyankar PetscInt *rowlengths = 0,M,N,*cols,grows,gcols; 817aabbc4fbSShri Abhyankar PetscScalar *vals,*svals,*v,*w; 818aabbc4fbSShri Abhyankar MPI_Comm comm = ((PetscObject)viewer)->comm; 819aabbc4fbSShri Abhyankar 820aabbc4fbSShri Abhyankar PetscFunctionBegin; 821aabbc4fbSShri Abhyankar ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 822aabbc4fbSShri Abhyankar if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor"); 823aabbc4fbSShri Abhyankar ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 824aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 825aabbc4fbSShri Abhyankar if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 826aabbc4fbSShri Abhyankar M = header[1]; N = header[2]; nz = header[3]; 827aabbc4fbSShri Abhyankar 828aabbc4fbSShri Abhyankar /* set global size if not set already*/ 829aabbc4fbSShri Abhyankar if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) { 830aabbc4fbSShri Abhyankar ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr); 831aabbc4fbSShri Abhyankar } else { 832aabbc4fbSShri Abhyankar /* if sizes and type are already set, check if the vector global sizes are correct */ 833aabbc4fbSShri Abhyankar ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr); 834aabbc4fbSShri 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); 835aabbc4fbSShri Abhyankar } 836aabbc4fbSShri Abhyankar ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr); 837aabbc4fbSShri Abhyankar 838aabbc4fbSShri Abhyankar if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 839aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 840aabbc4fbSShri Abhyankar v = a->v; 841aabbc4fbSShri Abhyankar /* Allocate some temp space to read in the values and then flip them 842aabbc4fbSShri Abhyankar from row major to column major */ 843aabbc4fbSShri Abhyankar ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr); 844aabbc4fbSShri Abhyankar /* read in nonzero values */ 845aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 846aabbc4fbSShri Abhyankar /* now flip the values and store them in the matrix*/ 847aabbc4fbSShri Abhyankar for (j=0; j<N; j++) { 848aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 849aabbc4fbSShri Abhyankar *v++ =w[i*N+j]; 850aabbc4fbSShri Abhyankar } 851aabbc4fbSShri Abhyankar } 852aabbc4fbSShri Abhyankar ierr = PetscFree(w);CHKERRQ(ierr); 853aabbc4fbSShri Abhyankar } else { 854aabbc4fbSShri Abhyankar /* read row lengths */ 855aabbc4fbSShri Abhyankar ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr); 856aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 857aabbc4fbSShri Abhyankar 858aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 859aabbc4fbSShri Abhyankar v = a->v; 860aabbc4fbSShri Abhyankar 861aabbc4fbSShri Abhyankar /* read column indices and nonzeros */ 862aabbc4fbSShri Abhyankar ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr); 863aabbc4fbSShri Abhyankar cols = scols; 864aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 865aabbc4fbSShri Abhyankar ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr); 866aabbc4fbSShri Abhyankar vals = svals; 867aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 868aabbc4fbSShri Abhyankar 869aabbc4fbSShri Abhyankar /* insert into matrix */ 870aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 871aabbc4fbSShri Abhyankar for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 872aabbc4fbSShri Abhyankar svals += rowlengths[i]; scols += rowlengths[i]; 873aabbc4fbSShri Abhyankar } 874aabbc4fbSShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 875aabbc4fbSShri Abhyankar ierr = PetscFree(cols);CHKERRQ(ierr); 876aabbc4fbSShri Abhyankar ierr = PetscFree(rowlengths);CHKERRQ(ierr); 877aabbc4fbSShri Abhyankar } 878aabbc4fbSShri Abhyankar ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 879aabbc4fbSShri Abhyankar ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 880aabbc4fbSShri Abhyankar 881aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 882aabbc4fbSShri Abhyankar } 883aabbc4fbSShri Abhyankar 884aabbc4fbSShri Abhyankar #undef __FUNCT__ 8854a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII" 8866849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 887289bc588SBarry Smith { 888932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 889dfbe8321SBarry Smith PetscErrorCode ierr; 89013f74950SBarry Smith PetscInt i,j; 8912dcb1b2aSMatthew Knepley const char *name; 89287828ca2SBarry Smith PetscScalar *v; 893f3ef73ceSBarry Smith PetscViewerFormat format; 8945f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 895ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 8965f481a85SSatish Balay #endif 897932b0c3eSLois Curfman McInnes 8983a40ed3dSBarry Smith PetscFunctionBegin; 899b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 900456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 9013a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 902fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 903d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 9047566de4bSShri Abhyankar ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr); 905d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 90644cd7ae7SLois Curfman McInnes v = a->v + i; 90777431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 908d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 909aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 910329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 911a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 912329f5518SBarry Smith } else if (PetscRealPart(*v)) { 913a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr); 9146831982aSBarry Smith } 91580cd9d93SLois Curfman McInnes #else 9166831982aSBarry Smith if (*v) { 917a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr); 9186831982aSBarry Smith } 91980cd9d93SLois Curfman McInnes #endif 9201b807ce4Svictorle v += a->lda; 92180cd9d93SLois Curfman McInnes } 922b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 92380cd9d93SLois Curfman McInnes } 924d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 9253a40ed3dSBarry Smith } else { 926d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 927aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 92847989497SBarry Smith /* determine if matrix has all real values */ 92947989497SBarry Smith v = a->v; 930d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 931ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;} 93247989497SBarry Smith } 93347989497SBarry Smith #endif 934fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 9353a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 936d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 937d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 938fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 9397566de4bSShri Abhyankar } else { 9407566de4bSShri Abhyankar ierr = PetscObjectPrintClassNamePrefixType((PetscObject)A,viewer,"Matrix Object");CHKERRQ(ierr); 941ffac6cdbSBarry Smith } 942ffac6cdbSBarry Smith 943d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 944932b0c3eSLois Curfman McInnes v = a->v + i; 945d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 946aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 94747989497SBarry Smith if (allreal) { 948c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr); 94947989497SBarry Smith } else { 950c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 95147989497SBarry Smith } 952289bc588SBarry Smith #else 953c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr); 954289bc588SBarry Smith #endif 9551b807ce4Svictorle v += a->lda; 956289bc588SBarry Smith } 957b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 958289bc588SBarry Smith } 959fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 960b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 961ffac6cdbSBarry Smith } 962d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 963da3a660dSBarry Smith } 964b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 9653a40ed3dSBarry Smith PetscFunctionReturn(0); 966289bc588SBarry Smith } 967289bc588SBarry Smith 9684a2ae208SSatish Balay #undef __FUNCT__ 9694a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary" 9706849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 971932b0c3eSLois Curfman McInnes { 972932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 9736849ba73SBarry Smith PetscErrorCode ierr; 97413f74950SBarry Smith int fd; 975d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 976f4403165SShri Abhyankar PetscScalar *v,*anonz,*vals; 977f4403165SShri Abhyankar PetscViewerFormat format; 978932b0c3eSLois Curfman McInnes 9793a40ed3dSBarry Smith PetscFunctionBegin; 980b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 98190ace30eSBarry Smith 982f4403165SShri Abhyankar ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 983f4403165SShri Abhyankar if (format == PETSC_VIEWER_NATIVE) { 984f4403165SShri Abhyankar /* store the matrix as a dense matrix */ 985f4403165SShri Abhyankar ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 986f4403165SShri Abhyankar col_lens[0] = MAT_FILE_CLASSID; 987f4403165SShri Abhyankar col_lens[1] = m; 988f4403165SShri Abhyankar col_lens[2] = n; 989f4403165SShri Abhyankar col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 990f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 991f4403165SShri Abhyankar ierr = PetscFree(col_lens);CHKERRQ(ierr); 992f4403165SShri Abhyankar 993f4403165SShri Abhyankar /* write out matrix, by rows */ 994f4403165SShri Abhyankar ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr); 995f4403165SShri Abhyankar v = a->v; 996f4403165SShri Abhyankar for (j=0; j<n; j++) { 997f4403165SShri Abhyankar for (i=0; i<m; i++) { 998f4403165SShri Abhyankar vals[j + i*n] = *v++; 999f4403165SShri Abhyankar } 1000f4403165SShri Abhyankar } 1001f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1002f4403165SShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1003f4403165SShri Abhyankar } else { 100413f74950SBarry Smith ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 10050700a824SBarry Smith col_lens[0] = MAT_FILE_CLASSID; 1006932b0c3eSLois Curfman McInnes col_lens[1] = m; 1007932b0c3eSLois Curfman McInnes col_lens[2] = n; 1008932b0c3eSLois Curfman McInnes col_lens[3] = nz; 1009932b0c3eSLois Curfman McInnes 1010932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 1011932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 10126f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1013932b0c3eSLois Curfman McInnes 1014932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 1015932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 1016932b0c3eSLois Curfman McInnes ict = 0; 1017932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1018932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 1019932b0c3eSLois Curfman McInnes } 10206f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 1021606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 1022932b0c3eSLois Curfman McInnes 1023932b0c3eSLois Curfman McInnes /* store nonzero values */ 102487828ca2SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr); 1025932b0c3eSLois Curfman McInnes ict = 0; 1026932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1027932b0c3eSLois Curfman McInnes v = a->v + i; 1028932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 10291b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 1030932b0c3eSLois Curfman McInnes } 1031932b0c3eSLois Curfman McInnes } 10326f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1033606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 1034f4403165SShri Abhyankar } 10353a40ed3dSBarry Smith PetscFunctionReturn(0); 1036932b0c3eSLois Curfman McInnes } 1037932b0c3eSLois Curfman McInnes 10384a2ae208SSatish Balay #undef __FUNCT__ 10394a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom" 1040dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1041f1af5d2fSBarry Smith { 1042f1af5d2fSBarry Smith Mat A = (Mat) Aa; 1043f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 10446849ba73SBarry Smith PetscErrorCode ierr; 1045d0f46423SBarry Smith PetscInt m = A->rmap->n,n = A->cmap->n,color,i,j; 104687828ca2SBarry Smith PetscScalar *v = a->v; 1047b0a32e0cSBarry Smith PetscViewer viewer; 1048b0a32e0cSBarry Smith PetscDraw popup; 1049329f5518SBarry Smith PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0; 1050f3ef73ceSBarry Smith PetscViewerFormat format; 1051f1af5d2fSBarry Smith 1052f1af5d2fSBarry Smith PetscFunctionBegin; 1053f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1054b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1055b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1056f1af5d2fSBarry Smith 1057f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1058fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1059f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1060b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1061f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1062f1af5d2fSBarry Smith x_l = j; 1063f1af5d2fSBarry Smith x_r = x_l + 1.0; 1064f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1065f1af5d2fSBarry Smith y_l = m - i - 1.0; 1066f1af5d2fSBarry Smith y_r = y_l + 1.0; 1067329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1068b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1069329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1070b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1071f1af5d2fSBarry Smith } else { 1072f1af5d2fSBarry Smith continue; 1073f1af5d2fSBarry Smith } 1074b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1075f1af5d2fSBarry Smith } 1076f1af5d2fSBarry Smith } 1077f1af5d2fSBarry Smith } else { 1078f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1079f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1080f1af5d2fSBarry Smith for (i = 0; i < m*n; i++) { 1081f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1082f1af5d2fSBarry Smith } 1083b0a32e0cSBarry Smith scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv; 1084b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 1085b0a32e0cSBarry Smith if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);} 1086f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1087f1af5d2fSBarry Smith x_l = j; 1088f1af5d2fSBarry Smith x_r = x_l + 1.0; 1089f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1090f1af5d2fSBarry Smith y_l = m - i - 1.0; 1091f1af5d2fSBarry Smith y_r = y_l + 1.0; 1092b0a32e0cSBarry Smith color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i])); 1093b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1094f1af5d2fSBarry Smith } 1095f1af5d2fSBarry Smith } 1096f1af5d2fSBarry Smith } 1097f1af5d2fSBarry Smith PetscFunctionReturn(0); 1098f1af5d2fSBarry Smith } 1099f1af5d2fSBarry Smith 11004a2ae208SSatish Balay #undef __FUNCT__ 11014a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 1102dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1103f1af5d2fSBarry Smith { 1104b0a32e0cSBarry Smith PetscDraw draw; 1105ace3abfcSBarry Smith PetscBool isnull; 1106329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1107dfbe8321SBarry Smith PetscErrorCode ierr; 1108f1af5d2fSBarry Smith 1109f1af5d2fSBarry Smith PetscFunctionBegin; 1110b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1111b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1112abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1113f1af5d2fSBarry Smith 1114f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1115d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1116f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1117b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1118b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 1119f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr); 1120f1af5d2fSBarry Smith PetscFunctionReturn(0); 1121f1af5d2fSBarry Smith } 1122f1af5d2fSBarry Smith 11234a2ae208SSatish Balay #undef __FUNCT__ 11244a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 1125dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1126932b0c3eSLois Curfman McInnes { 1127dfbe8321SBarry Smith PetscErrorCode ierr; 1128ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1129932b0c3eSLois Curfman McInnes 11303a40ed3dSBarry Smith PetscFunctionBegin; 1131251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1132251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1133251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 11340f5bd95cSBarry Smith 1135c45a1595SBarry Smith if (iascii) { 1136c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 11370f5bd95cSBarry Smith } else if (isbinary) { 11383a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1139f1af5d2fSBarry Smith } else if (isdraw) { 1140f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1141932b0c3eSLois Curfman McInnes } 11423a40ed3dSBarry Smith PetscFunctionReturn(0); 1143932b0c3eSLois Curfman McInnes } 1144289bc588SBarry Smith 11454a2ae208SSatish Balay #undef __FUNCT__ 11464a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1147dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat) 1148289bc588SBarry Smith { 1149ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1150dfbe8321SBarry Smith PetscErrorCode ierr; 115190f02eecSBarry Smith 11523a40ed3dSBarry Smith PetscFunctionBegin; 1153aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1154d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1155a5a9c739SBarry Smith #endif 115605b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 11576857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1158bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1159dbd8c25aSHong Zhang 1160dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 11618c778c55SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatDenseGetArray_C","",PETSC_NULL);CHKERRQ(ierr); 11628c778c55SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatDenseRestoreArray_C","",PETSC_NULL);CHKERRQ(ierr); 1163901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr); 11644ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMult_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11654ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11664ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 11673a40ed3dSBarry Smith PetscFunctionReturn(0); 1168289bc588SBarry Smith } 1169289bc588SBarry Smith 11704a2ae208SSatish Balay #undef __FUNCT__ 11714a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1172fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1173289bc588SBarry Smith { 1174c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 11756849ba73SBarry Smith PetscErrorCode ierr; 117613f74950SBarry Smith PetscInt k,j,m,n,M; 117787828ca2SBarry Smith PetscScalar *v,tmp; 117848b35521SBarry Smith 11793a40ed3dSBarry Smith PetscFunctionBegin; 1180d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 1181e9695a30SBarry Smith if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */ 1182e7e72b3dSBarry Smith if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1183e7e72b3dSBarry Smith else { 1184d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1185289bc588SBarry Smith for (k=0; k<j; k++) { 11861b807ce4Svictorle tmp = v[j + k*M]; 11871b807ce4Svictorle v[j + k*M] = v[k + j*M]; 11881b807ce4Svictorle v[k + j*M] = tmp; 1189289bc588SBarry Smith } 1190289bc588SBarry Smith } 1191d64ed03dSBarry Smith } 11923a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1193d3e5ee88SLois Curfman McInnes Mat tmat; 1194ec8511deSBarry Smith Mat_SeqDense *tmatd; 119587828ca2SBarry Smith PetscScalar *v2; 1196ea709b57SSatish Balay 1197fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX) { 11987adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,&tmat);CHKERRQ(ierr); 1199d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 12007adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 12015c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr); 1202fc4dec0aSBarry Smith } else { 1203fc4dec0aSBarry Smith tmat = *matout; 1204fc4dec0aSBarry Smith } 1205ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 12060de55854SLois Curfman McInnes v = mat->v; v2 = tmatd->v; 1207d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 12081b807ce4Svictorle for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M]; 1209d3e5ee88SLois Curfman McInnes } 12106d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 12116d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1212d3e5ee88SLois Curfman McInnes *matout = tmat; 121348b35521SBarry Smith } 12143a40ed3dSBarry Smith PetscFunctionReturn(0); 1215289bc588SBarry Smith } 1216289bc588SBarry Smith 12174a2ae208SSatish Balay #undef __FUNCT__ 12184a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1219ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1220289bc588SBarry Smith { 1221c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1222c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 122313f74950SBarry Smith PetscInt i,j; 1224a2ea699eSBarry Smith PetscScalar *v1,*v2; 12259ea5d5aeSSatish Balay 12263a40ed3dSBarry Smith PetscFunctionBegin; 1227d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1228d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1229d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 12301b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1231d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 12323a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 12331b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 12341b807ce4Svictorle } 1235289bc588SBarry Smith } 123677c4ece6SBarry Smith *flg = PETSC_TRUE; 12373a40ed3dSBarry Smith PetscFunctionReturn(0); 1238289bc588SBarry Smith } 1239289bc588SBarry Smith 12404a2ae208SSatish Balay #undef __FUNCT__ 12414a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1242dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1243289bc588SBarry Smith { 1244c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1245dfbe8321SBarry Smith PetscErrorCode ierr; 124613f74950SBarry Smith PetscInt i,n,len; 124787828ca2SBarry Smith PetscScalar *x,zero = 0.0; 124844cd7ae7SLois Curfman McInnes 12493a40ed3dSBarry Smith PetscFunctionBegin; 12502dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 12517a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 12521ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1253d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1254e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 125544cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 12561b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1257289bc588SBarry Smith } 12581ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 12593a40ed3dSBarry Smith PetscFunctionReturn(0); 1260289bc588SBarry Smith } 1261289bc588SBarry Smith 12624a2ae208SSatish Balay #undef __FUNCT__ 12634a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1264dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1265289bc588SBarry Smith { 1266c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 126787828ca2SBarry Smith PetscScalar *l,*r,x,*v; 1268dfbe8321SBarry Smith PetscErrorCode ierr; 1269d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 127055659b69SBarry Smith 12713a40ed3dSBarry Smith PetscFunctionBegin; 127228988994SBarry Smith if (ll) { 12737a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 12741ebc52fbSHong Zhang ierr = VecGetArray(ll,&l);CHKERRQ(ierr); 1275e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1276da3a660dSBarry Smith for (i=0; i<m; i++) { 1277da3a660dSBarry Smith x = l[i]; 1278da3a660dSBarry Smith v = mat->v + i; 1279da3a660dSBarry Smith for (j=0; j<n; j++) { (*v) *= x; v+= m;} 1280da3a660dSBarry Smith } 12811ebc52fbSHong Zhang ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr); 1282efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1283da3a660dSBarry Smith } 128428988994SBarry Smith if (rr) { 12857a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 12861ebc52fbSHong Zhang ierr = VecGetArray(rr,&r);CHKERRQ(ierr); 1287e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1288da3a660dSBarry Smith for (i=0; i<n; i++) { 1289da3a660dSBarry Smith x = r[i]; 1290da3a660dSBarry Smith v = mat->v + i*m; 1291da3a660dSBarry Smith for (j=0; j<m; j++) { (*v++) *= x;} 1292da3a660dSBarry Smith } 12931ebc52fbSHong Zhang ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr); 1294efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1295da3a660dSBarry Smith } 12963a40ed3dSBarry Smith PetscFunctionReturn(0); 1297289bc588SBarry Smith } 1298289bc588SBarry Smith 12994a2ae208SSatish Balay #undef __FUNCT__ 13004a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1301dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1302289bc588SBarry Smith { 1303c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 130487828ca2SBarry Smith PetscScalar *v = mat->v; 1305329f5518SBarry Smith PetscReal sum = 0.0; 1306d0f46423SBarry Smith PetscInt lda=mat->lda,m=A->rmap->n,i,j; 1307efee365bSSatish Balay PetscErrorCode ierr; 130855659b69SBarry Smith 13093a40ed3dSBarry Smith PetscFunctionBegin; 1310289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1311a5ce6ee0Svictorle if (lda>m) { 1312d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1313a5ce6ee0Svictorle v = mat->v+j*lda; 1314a5ce6ee0Svictorle for (i=0; i<m; i++) { 1315a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1316a5ce6ee0Svictorle } 1317a5ce6ee0Svictorle } 1318a5ce6ee0Svictorle } else { 1319d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1320329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1321289bc588SBarry Smith } 1322a5ce6ee0Svictorle } 13238f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1324dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13253a40ed3dSBarry Smith } else if (type == NORM_1) { 1326064f8208SBarry Smith *nrm = 0.0; 1327d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 13281b807ce4Svictorle v = mat->v + j*mat->lda; 1329289bc588SBarry Smith sum = 0.0; 1330d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 133133a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1332289bc588SBarry Smith } 1333064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1334289bc588SBarry Smith } 1335d0f46423SBarry Smith ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr); 13363a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1337064f8208SBarry Smith *nrm = 0.0; 1338d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1339289bc588SBarry Smith v = mat->v + j; 1340289bc588SBarry Smith sum = 0.0; 1341d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 13421b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1343289bc588SBarry Smith } 1344064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1345289bc588SBarry Smith } 1346d0f46423SBarry Smith ierr = PetscLogFlops(A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1347e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 13483a40ed3dSBarry Smith PetscFunctionReturn(0); 1349289bc588SBarry Smith } 1350289bc588SBarry Smith 13514a2ae208SSatish Balay #undef __FUNCT__ 13524a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1353ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1354289bc588SBarry Smith { 1355c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 135663ba0a88SBarry Smith PetscErrorCode ierr; 135767e560aaSBarry Smith 13583a40ed3dSBarry Smith PetscFunctionBegin; 1359b5a2b587SKris Buschelman switch (op) { 1360b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 13614e0d8c25SBarry Smith aij->roworiented = flg; 1362b5a2b587SKris Buschelman break; 1363512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1364b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 13653971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 13664e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 136713fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1368b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1369b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 13705021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 13715021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 13725021d80fSJed Brown break; 13735021d80fSJed Brown case MAT_SPD: 137477e54ba9SKris Buschelman case MAT_SYMMETRIC: 137577e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 13769a4540c5SBarry Smith case MAT_HERMITIAN: 13779a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 13785021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 137977e54ba9SKris Buschelman break; 1380b5a2b587SKris Buschelman default: 1381e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 13823a40ed3dSBarry Smith } 13833a40ed3dSBarry Smith PetscFunctionReturn(0); 1384289bc588SBarry Smith } 1385289bc588SBarry Smith 13864a2ae208SSatish Balay #undef __FUNCT__ 13874a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1388dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A) 13896f0a148fSBarry Smith { 1390ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 13916849ba73SBarry Smith PetscErrorCode ierr; 1392d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 13933a40ed3dSBarry Smith 13943a40ed3dSBarry Smith PetscFunctionBegin; 1395a5ce6ee0Svictorle if (lda>m) { 1396d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1397a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1398a5ce6ee0Svictorle } 1399a5ce6ee0Svictorle } else { 1400d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1401a5ce6ee0Svictorle } 14023a40ed3dSBarry Smith PetscFunctionReturn(0); 14036f0a148fSBarry Smith } 14046f0a148fSBarry Smith 14054a2ae208SSatish Balay #undef __FUNCT__ 14064a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 14072b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 14086f0a148fSBarry Smith { 140997b48c8fSBarry Smith PetscErrorCode ierr; 1410ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1411b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 141297b48c8fSBarry Smith PetscScalar *slot,*bb; 141397b48c8fSBarry Smith const PetscScalar *xx; 141455659b69SBarry Smith 14153a40ed3dSBarry Smith PetscFunctionBegin; 1416b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1417b9679d65SBarry Smith for (i=0; i<N; i++) { 1418b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1419b9679d65SBarry 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); 1420b9679d65SBarry Smith } 1421b9679d65SBarry Smith #endif 1422b9679d65SBarry Smith 142397b48c8fSBarry Smith /* fix right hand side if needed */ 142497b48c8fSBarry Smith if (x && b) { 142597b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 142697b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 142797b48c8fSBarry Smith for (i=0; i<N; i++) { 142897b48c8fSBarry Smith bb[rows[i]] = diag*xx[rows[i]]; 142997b48c8fSBarry Smith } 143097b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 143197b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 143297b48c8fSBarry Smith } 143397b48c8fSBarry Smith 14346f0a148fSBarry Smith for (i=0; i<N; i++) { 14356f0a148fSBarry Smith slot = l->v + rows[i]; 1436b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 14376f0a148fSBarry Smith } 1438f4df32b1SMatthew Knepley if (diag != 0.0) { 1439b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 14406f0a148fSBarry Smith for (i=0; i<N; i++) { 1441b9679d65SBarry Smith slot = l->v + (m+1)*rows[i]; 1442f4df32b1SMatthew Knepley *slot = diag; 14436f0a148fSBarry Smith } 14446f0a148fSBarry Smith } 14453a40ed3dSBarry Smith PetscFunctionReturn(0); 14466f0a148fSBarry Smith } 1447557bce09SLois Curfman McInnes 14484a2ae208SSatish Balay #undef __FUNCT__ 14498c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense" 14508c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[]) 145164e87e97SBarry Smith { 1452c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 14533a40ed3dSBarry Smith 14543a40ed3dSBarry Smith PetscFunctionBegin; 1455e32f2f54SBarry 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"); 145664e87e97SBarry Smith *array = mat->v; 14573a40ed3dSBarry Smith PetscFunctionReturn(0); 145864e87e97SBarry Smith } 14590754003eSLois Curfman McInnes 14604a2ae208SSatish Balay #undef __FUNCT__ 14618c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense" 14628c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1463ff14e315SSatish Balay { 14643a40ed3dSBarry Smith PetscFunctionBegin; 146509b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 14663a40ed3dSBarry Smith PetscFunctionReturn(0); 1467ff14e315SSatish Balay } 14680754003eSLois Curfman McInnes 14694a2ae208SSatish Balay #undef __FUNCT__ 14708c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray" 1471dec5eb66SMatthew G Knepley /*@C 14728c778c55SBarry Smith MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored 147373a71a0fSBarry Smith 147473a71a0fSBarry Smith Not Collective 147573a71a0fSBarry Smith 147673a71a0fSBarry Smith Input Parameter: 147773a71a0fSBarry Smith . mat - a MATSEQDENSE matrix 147873a71a0fSBarry Smith 147973a71a0fSBarry Smith Output Parameter: 148073a71a0fSBarry Smith . array - pointer to the data 148173a71a0fSBarry Smith 148273a71a0fSBarry Smith Level: intermediate 148373a71a0fSBarry Smith 14848c778c55SBarry Smith .seealso: MatDenseRestoreArray() 148573a71a0fSBarry Smith @*/ 14868c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 148773a71a0fSBarry Smith { 148873a71a0fSBarry Smith PetscErrorCode ierr; 148973a71a0fSBarry Smith 149073a71a0fSBarry Smith PetscFunctionBegin; 14918c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 149273a71a0fSBarry Smith PetscFunctionReturn(0); 149373a71a0fSBarry Smith } 149473a71a0fSBarry Smith 149573a71a0fSBarry Smith #undef __FUNCT__ 14968c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray" 1497dec5eb66SMatthew G Knepley /*@C 14988c778c55SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a SeqDense matrix is stored obtained by MatDenseGetArray() 149973a71a0fSBarry Smith 150073a71a0fSBarry Smith Not Collective 150173a71a0fSBarry Smith 150273a71a0fSBarry Smith Input Parameters: 150373a71a0fSBarry Smith . mat - a MATSEQDENSE matrix 150473a71a0fSBarry Smith . array - pointer to the data 150573a71a0fSBarry Smith 150673a71a0fSBarry Smith Level: intermediate 150773a71a0fSBarry Smith 15088c778c55SBarry Smith .seealso: MatDenseGetArray() 150973a71a0fSBarry Smith @*/ 15108c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 151173a71a0fSBarry Smith { 151273a71a0fSBarry Smith PetscErrorCode ierr; 151373a71a0fSBarry Smith 151473a71a0fSBarry Smith PetscFunctionBegin; 15158c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 151673a71a0fSBarry Smith PetscFunctionReturn(0); 151773a71a0fSBarry Smith } 151873a71a0fSBarry Smith 151973a71a0fSBarry Smith #undef __FUNCT__ 15204a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 152113f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 15220754003eSLois Curfman McInnes { 1523c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 15246849ba73SBarry Smith PetscErrorCode ierr; 15255d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 15265d0c19d7SBarry Smith const PetscInt *irow,*icol; 152787828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 15280754003eSLois Curfman McInnes Mat newmat; 15290754003eSLois Curfman McInnes 15303a40ed3dSBarry Smith PetscFunctionBegin; 153178b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 153278b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1533e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1534e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 15350754003eSLois Curfman McInnes 1536182d2002SSatish Balay /* Check submatrixcall */ 1537182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 153813f74950SBarry Smith PetscInt n_cols,n_rows; 1539182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 154021a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1541f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1542c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 154321a2c019SBarry Smith } 1544182d2002SSatish Balay newmat = *B; 1545182d2002SSatish Balay } else { 15460754003eSLois Curfman McInnes /* Create and fill new matrix */ 15477adad957SLisandro Dalcin ierr = MatCreate(((PetscObject)A)->comm,&newmat);CHKERRQ(ierr); 1548f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 15497adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 15505c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr); 1551182d2002SSatish Balay } 1552182d2002SSatish Balay 1553182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1554182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1555182d2002SSatish Balay 1556182d2002SSatish Balay for (i=0; i<ncols; i++) { 15576de62eeeSBarry Smith av = v + mat->lda*icol[i]; 1558182d2002SSatish Balay for (j=0; j<nrows; j++) { 1559182d2002SSatish Balay *bv++ = av[irow[j]]; 15600754003eSLois Curfman McInnes } 15610754003eSLois Curfman McInnes } 1562182d2002SSatish Balay 1563182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 15646d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15656d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 15660754003eSLois Curfman McInnes 15670754003eSLois Curfman McInnes /* Free work space */ 156878b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 156978b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1570182d2002SSatish Balay *B = newmat; 15713a40ed3dSBarry Smith PetscFunctionReturn(0); 15720754003eSLois Curfman McInnes } 15730754003eSLois Curfman McInnes 15744a2ae208SSatish Balay #undef __FUNCT__ 15754a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 157613f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1577905e6a2fSBarry Smith { 15786849ba73SBarry Smith PetscErrorCode ierr; 157913f74950SBarry Smith PetscInt i; 1580905e6a2fSBarry Smith 15813a40ed3dSBarry Smith PetscFunctionBegin; 1582905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1583b0a32e0cSBarry Smith ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr); 1584905e6a2fSBarry Smith } 1585905e6a2fSBarry Smith 1586905e6a2fSBarry Smith for (i=0; i<n; i++) { 15876a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1588905e6a2fSBarry Smith } 15893a40ed3dSBarry Smith PetscFunctionReturn(0); 1590905e6a2fSBarry Smith } 1591905e6a2fSBarry Smith 15924a2ae208SSatish Balay #undef __FUNCT__ 1593c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1594c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1595c0aa2d19SHong Zhang { 1596c0aa2d19SHong Zhang PetscFunctionBegin; 1597c0aa2d19SHong Zhang PetscFunctionReturn(0); 1598c0aa2d19SHong Zhang } 1599c0aa2d19SHong Zhang 1600c0aa2d19SHong Zhang #undef __FUNCT__ 1601c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1602c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1603c0aa2d19SHong Zhang { 1604c0aa2d19SHong Zhang PetscFunctionBegin; 1605c0aa2d19SHong Zhang PetscFunctionReturn(0); 1606c0aa2d19SHong Zhang } 1607c0aa2d19SHong Zhang 1608c0aa2d19SHong Zhang #undef __FUNCT__ 16094a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1610dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 16114b0e389bSBarry Smith { 16124b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data; 16136849ba73SBarry Smith PetscErrorCode ierr; 1614d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 16153a40ed3dSBarry Smith 16163a40ed3dSBarry Smith PetscFunctionBegin; 161733f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 161833f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1619cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 16203a40ed3dSBarry Smith PetscFunctionReturn(0); 16213a40ed3dSBarry Smith } 1622e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1623a5ce6ee0Svictorle if (lda1>m || lda2>m) { 16240dbb7854Svictorle for (j=0; j<n; j++) { 1625a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1626a5ce6ee0Svictorle } 1627a5ce6ee0Svictorle } else { 1628d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1629a5ce6ee0Svictorle } 1630273d9f13SBarry Smith PetscFunctionReturn(0); 1631273d9f13SBarry Smith } 1632273d9f13SBarry Smith 16334a2ae208SSatish Balay #undef __FUNCT__ 16344994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense" 16354994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A) 1636273d9f13SBarry Smith { 1637dfbe8321SBarry Smith PetscErrorCode ierr; 1638273d9f13SBarry Smith 1639273d9f13SBarry Smith PetscFunctionBegin; 1640273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 16413a40ed3dSBarry Smith PetscFunctionReturn(0); 16424b0e389bSBarry Smith } 16434b0e389bSBarry Smith 1644284134d9SBarry Smith #undef __FUNCT__ 1645ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense" 1646ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1647ba337c44SJed Brown { 1648ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1649ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1650ba337c44SJed Brown PetscScalar *aa = a->v; 1651ba337c44SJed Brown 1652ba337c44SJed Brown PetscFunctionBegin; 1653ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1654ba337c44SJed Brown PetscFunctionReturn(0); 1655ba337c44SJed Brown } 1656ba337c44SJed Brown 1657ba337c44SJed Brown #undef __FUNCT__ 1658ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense" 1659ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1660ba337c44SJed Brown { 1661ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1662ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1663ba337c44SJed Brown PetscScalar *aa = a->v; 1664ba337c44SJed Brown 1665ba337c44SJed Brown PetscFunctionBegin; 1666ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1667ba337c44SJed Brown PetscFunctionReturn(0); 1668ba337c44SJed Brown } 1669ba337c44SJed Brown 1670ba337c44SJed Brown #undef __FUNCT__ 1671ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense" 1672ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 1673ba337c44SJed Brown { 1674ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1675ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1676ba337c44SJed Brown PetscScalar *aa = a->v; 1677ba337c44SJed Brown 1678ba337c44SJed Brown PetscFunctionBegin; 1679ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 1680ba337c44SJed Brown PetscFunctionReturn(0); 1681ba337c44SJed Brown } 1682284134d9SBarry Smith 1683a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1684a9fe9ddaSSatish Balay #undef __FUNCT__ 1685a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1686a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1687a9fe9ddaSSatish Balay { 1688a9fe9ddaSSatish Balay PetscErrorCode ierr; 1689a9fe9ddaSSatish Balay 1690a9fe9ddaSSatish Balay PetscFunctionBegin; 1691a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 1692a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1693a9fe9ddaSSatish Balay } 1694a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1695a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1696a9fe9ddaSSatish Balay } 1697a9fe9ddaSSatish Balay 1698a9fe9ddaSSatish Balay #undef __FUNCT__ 1699a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1700a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1701a9fe9ddaSSatish Balay { 1702ee16a9a1SHong Zhang PetscErrorCode ierr; 1703d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1704ee16a9a1SHong Zhang Mat Cmat; 1705a9fe9ddaSSatish Balay 1706ee16a9a1SHong Zhang PetscFunctionBegin; 1707e32f2f54SBarry 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); 1708ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1709ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1710ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1711ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1712d73949e8SHong Zhang 1713ee16a9a1SHong Zhang *C = Cmat; 1714ee16a9a1SHong Zhang PetscFunctionReturn(0); 1715ee16a9a1SHong Zhang } 1716a9fe9ddaSSatish Balay 171798a3b096SSatish Balay #undef __FUNCT__ 1718a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1719a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1720a9fe9ddaSSatish Balay { 1721a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1722a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1723a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 17240805154bSBarry Smith PetscBLASInt m,n,k; 1725a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1726*c5df96a5SBarry Smith PetscErrorCode ierr; 1727a9fe9ddaSSatish Balay 1728a9fe9ddaSSatish Balay PetscFunctionBegin; 1729*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1730*c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1731*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 1732a9fe9ddaSSatish Balay BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1733a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1734a9fe9ddaSSatish Balay } 1735a9fe9ddaSSatish Balay 1736a9fe9ddaSSatish Balay #undef __FUNCT__ 173775648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense" 173875648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1739a9fe9ddaSSatish Balay { 1740a9fe9ddaSSatish Balay PetscErrorCode ierr; 1741a9fe9ddaSSatish Balay 1742a9fe9ddaSSatish Balay PetscFunctionBegin; 1743a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 174475648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1745a9fe9ddaSSatish Balay } 174675648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1747a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1748a9fe9ddaSSatish Balay } 1749a9fe9ddaSSatish Balay 1750a9fe9ddaSSatish Balay #undef __FUNCT__ 175175648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense" 175275648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1753a9fe9ddaSSatish Balay { 1754ee16a9a1SHong Zhang PetscErrorCode ierr; 1755d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1756ee16a9a1SHong Zhang Mat Cmat; 1757a9fe9ddaSSatish Balay 1758ee16a9a1SHong Zhang PetscFunctionBegin; 1759e32f2f54SBarry 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); 1760ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1761ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1762ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1763ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1764ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 1765ee16a9a1SHong Zhang *C = Cmat; 1766ee16a9a1SHong Zhang PetscFunctionReturn(0); 1767ee16a9a1SHong Zhang } 1768a9fe9ddaSSatish Balay 1769a9fe9ddaSSatish Balay #undef __FUNCT__ 177075648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense" 177175648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1772a9fe9ddaSSatish Balay { 1773a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1774a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1775a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 17760805154bSBarry Smith PetscBLASInt m,n,k; 1777a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1778*c5df96a5SBarry Smith PetscErrorCode ierr; 1779a9fe9ddaSSatish Balay 1780a9fe9ddaSSatish Balay PetscFunctionBegin; 1781*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr); 1782*c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1783*c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 17842fbe02b9SBarry Smith /* 17852fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 17862fbe02b9SBarry Smith */ 1787a9fe9ddaSSatish Balay BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1788a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1789a9fe9ddaSSatish Balay } 1790985db425SBarry Smith 1791985db425SBarry Smith #undef __FUNCT__ 1792985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 1793985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1794985db425SBarry Smith { 1795985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1796985db425SBarry Smith PetscErrorCode ierr; 1797d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1798985db425SBarry Smith PetscScalar *x; 1799985db425SBarry Smith MatScalar *aa = a->v; 1800985db425SBarry Smith 1801985db425SBarry Smith PetscFunctionBegin; 1802e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1803985db425SBarry Smith 1804985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1805985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1806985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1807e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1808985db425SBarry Smith for (i=0; i<m; i++) { 1809985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1810985db425SBarry Smith for (j=1; j<n; j++) { 1811985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1812985db425SBarry Smith } 1813985db425SBarry Smith } 1814985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1815985db425SBarry Smith PetscFunctionReturn(0); 1816985db425SBarry Smith } 1817985db425SBarry Smith 1818985db425SBarry Smith #undef __FUNCT__ 1819985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 1820985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 1821985db425SBarry Smith { 1822985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1823985db425SBarry Smith PetscErrorCode ierr; 1824d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1825985db425SBarry Smith PetscScalar *x; 1826985db425SBarry Smith PetscReal atmp; 1827985db425SBarry Smith MatScalar *aa = a->v; 1828985db425SBarry Smith 1829985db425SBarry Smith PetscFunctionBegin; 1830e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1831985db425SBarry Smith 1832985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1833985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1834985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1835e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1836985db425SBarry Smith for (i=0; i<m; i++) { 18379189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 1838985db425SBarry Smith for (j=1; j<n; j++) { 1839985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 1840985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 1841985db425SBarry Smith } 1842985db425SBarry Smith } 1843985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1844985db425SBarry Smith PetscFunctionReturn(0); 1845985db425SBarry Smith } 1846985db425SBarry Smith 1847985db425SBarry Smith #undef __FUNCT__ 1848985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 1849985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 1850985db425SBarry Smith { 1851985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1852985db425SBarry Smith PetscErrorCode ierr; 1853d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1854985db425SBarry Smith PetscScalar *x; 1855985db425SBarry Smith MatScalar *aa = a->v; 1856985db425SBarry Smith 1857985db425SBarry Smith PetscFunctionBegin; 1858e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1859985db425SBarry Smith 1860985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1861985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1862985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1863e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1864985db425SBarry Smith for (i=0; i<m; i++) { 1865985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1866985db425SBarry Smith for (j=1; j<n; j++) { 1867985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1868985db425SBarry Smith } 1869985db425SBarry Smith } 1870985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1871985db425SBarry Smith PetscFunctionReturn(0); 1872985db425SBarry Smith } 1873985db425SBarry Smith 18748d0534beSBarry Smith #undef __FUNCT__ 18758d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 18768d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 18778d0534beSBarry Smith { 18788d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 18798d0534beSBarry Smith PetscErrorCode ierr; 18808d0534beSBarry Smith PetscScalar *x; 18818d0534beSBarry Smith 18828d0534beSBarry Smith PetscFunctionBegin; 1883e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 18848d0534beSBarry Smith 18858d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1886d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 18878d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 18888d0534beSBarry Smith PetscFunctionReturn(0); 18898d0534beSBarry Smith } 18908d0534beSBarry Smith 18910716a85fSBarry Smith 18920716a85fSBarry Smith #undef __FUNCT__ 18930716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense" 18940716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 18950716a85fSBarry Smith { 18960716a85fSBarry Smith PetscErrorCode ierr; 18970716a85fSBarry Smith PetscInt i,j,m,n; 18980716a85fSBarry Smith PetscScalar *a; 18990716a85fSBarry Smith 19000716a85fSBarry Smith PetscFunctionBegin; 19010716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 19020716a85fSBarry Smith ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); 19038c778c55SBarry Smith ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr); 19040716a85fSBarry Smith if (type == NORM_2) { 19050716a85fSBarry Smith for (i=0; i<n; i++) { 19060716a85fSBarry Smith for (j=0; j<m; j++) { 19070716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 19080716a85fSBarry Smith } 19090716a85fSBarry Smith a += m; 19100716a85fSBarry Smith } 19110716a85fSBarry Smith } else if (type == NORM_1) { 19120716a85fSBarry Smith for (i=0; i<n; i++) { 19130716a85fSBarry Smith for (j=0; j<m; j++) { 19140716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 19150716a85fSBarry Smith } 19160716a85fSBarry Smith a += m; 19170716a85fSBarry Smith } 19180716a85fSBarry Smith } else if (type == NORM_INFINITY) { 19190716a85fSBarry Smith for (i=0; i<n; i++) { 19200716a85fSBarry Smith for (j=0; j<m; j++) { 19210716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 19220716a85fSBarry Smith } 19230716a85fSBarry Smith a += m; 19240716a85fSBarry Smith } 19250716a85fSBarry Smith } else SETERRQ(((PetscObject)A)->comm,PETSC_ERR_ARG_WRONG,"Unknown NormType"); 19268c778c55SBarry Smith ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr); 19270716a85fSBarry Smith if (type == NORM_2) { 19288f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 19290716a85fSBarry Smith } 19300716a85fSBarry Smith PetscFunctionReturn(0); 19310716a85fSBarry Smith } 19320716a85fSBarry Smith 193373a71a0fSBarry Smith #undef __FUNCT__ 193473a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense" 193573a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 193673a71a0fSBarry Smith { 193773a71a0fSBarry Smith PetscErrorCode ierr; 193873a71a0fSBarry Smith PetscScalar *a; 193973a71a0fSBarry Smith PetscInt m,n,i; 194073a71a0fSBarry Smith 194173a71a0fSBarry Smith PetscFunctionBegin; 194273a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 19438c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 194473a71a0fSBarry Smith for (i=0; i<m*n; i++) { 194573a71a0fSBarry Smith ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr); 194673a71a0fSBarry Smith } 19478c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 194873a71a0fSBarry Smith PetscFunctionReturn(0); 194973a71a0fSBarry Smith } 195073a71a0fSBarry Smith 195173a71a0fSBarry Smith 1952289bc588SBarry Smith /* -------------------------------------------------------------------*/ 1953a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 1954905e6a2fSBarry Smith MatGetRow_SeqDense, 1955905e6a2fSBarry Smith MatRestoreRow_SeqDense, 1956905e6a2fSBarry Smith MatMult_SeqDense, 195797304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 19587c922b88SBarry Smith MatMultTranspose_SeqDense, 19597c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 1960db4efbfdSBarry Smith 0, 1961db4efbfdSBarry Smith 0, 1962db4efbfdSBarry Smith 0, 1963db4efbfdSBarry Smith /* 10*/ 0, 1964905e6a2fSBarry Smith MatLUFactor_SeqDense, 1965905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 196641f059aeSBarry Smith MatSOR_SeqDense, 1967ec8511deSBarry Smith MatTranspose_SeqDense, 196897304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 1969905e6a2fSBarry Smith MatEqual_SeqDense, 1970905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 1971905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 1972905e6a2fSBarry Smith MatNorm_SeqDense, 1973c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 1974c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 1975905e6a2fSBarry Smith MatSetOption_SeqDense, 1976905e6a2fSBarry Smith MatZeroEntries_SeqDense, 1977d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 1978db4efbfdSBarry Smith 0, 1979db4efbfdSBarry Smith 0, 1980db4efbfdSBarry Smith 0, 1981db4efbfdSBarry Smith 0, 19824994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 1983273d9f13SBarry Smith 0, 1984905e6a2fSBarry Smith 0, 198573a71a0fSBarry Smith 0, 198673a71a0fSBarry Smith 0, 1987d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 1988a5ae1ecdSBarry Smith 0, 1989a5ae1ecdSBarry Smith 0, 1990a5ae1ecdSBarry Smith 0, 1991a5ae1ecdSBarry Smith 0, 1992d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 1993a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 1994a5ae1ecdSBarry Smith 0, 19954b0e389bSBarry Smith MatGetValues_SeqDense, 1996a5ae1ecdSBarry Smith MatCopy_SeqDense, 1997d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 1998a5ae1ecdSBarry Smith MatScale_SeqDense, 1999a5ae1ecdSBarry Smith 0, 2000a5ae1ecdSBarry Smith 0, 2001a5ae1ecdSBarry Smith 0, 200273a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2003a5ae1ecdSBarry Smith 0, 2004a5ae1ecdSBarry Smith 0, 2005a5ae1ecdSBarry Smith 0, 2006a5ae1ecdSBarry Smith 0, 2007d519adbfSMatthew Knepley /* 54*/ 0, 2008a5ae1ecdSBarry Smith 0, 2009a5ae1ecdSBarry Smith 0, 2010a5ae1ecdSBarry Smith 0, 2011a5ae1ecdSBarry Smith 0, 2012d519adbfSMatthew Knepley /* 59*/ 0, 2013e03a110bSBarry Smith MatDestroy_SeqDense, 2014e03a110bSBarry Smith MatView_SeqDense, 2015357abbc8SBarry Smith 0, 201697304618SKris Buschelman 0, 2017d519adbfSMatthew Knepley /* 64*/ 0, 201897304618SKris Buschelman 0, 201997304618SKris Buschelman 0, 202097304618SKris Buschelman 0, 202197304618SKris Buschelman 0, 2022d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 202397304618SKris Buschelman 0, 202497304618SKris Buschelman 0, 202597304618SKris Buschelman 0, 202697304618SKris Buschelman 0, 2027d519adbfSMatthew Knepley /* 74*/ 0, 202897304618SKris Buschelman 0, 202997304618SKris Buschelman 0, 203097304618SKris Buschelman 0, 203197304618SKris Buschelman 0, 2032d519adbfSMatthew Knepley /* 79*/ 0, 203397304618SKris Buschelman 0, 203497304618SKris Buschelman 0, 203597304618SKris Buschelman 0, 20365bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2037865e5f61SKris Buschelman 0, 20381cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2039865e5f61SKris Buschelman 0, 2040865e5f61SKris Buschelman 0, 2041865e5f61SKris Buschelman 0, 2042d519adbfSMatthew Knepley /* 89*/ MatMatMult_SeqDense_SeqDense, 2043a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 2044a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2045865e5f61SKris Buschelman 0, 2046865e5f61SKris Buschelman 0, 2047d519adbfSMatthew Knepley /* 94*/ 0, 20485df89d91SHong Zhang 0, 20495df89d91SHong Zhang 0, 20505df89d91SHong Zhang 0, 2051284134d9SBarry Smith 0, 2052d519adbfSMatthew Knepley /* 99*/ 0, 2053284134d9SBarry Smith 0, 2054284134d9SBarry Smith 0, 2055ba337c44SJed Brown MatConjugate_SeqDense, 2056f73d5cc4SBarry Smith 0, 2057ba337c44SJed Brown /*104*/ 0, 2058ba337c44SJed Brown MatRealPart_SeqDense, 2059ba337c44SJed Brown MatImaginaryPart_SeqDense, 2060985db425SBarry Smith 0, 2061985db425SBarry Smith 0, 206285e2c93fSHong Zhang /*109*/ MatMatSolve_SeqDense, 2063985db425SBarry Smith 0, 20648d0534beSBarry Smith MatGetRowMin_SeqDense, 2065aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 2066aabbc4fbSShri Abhyankar 0, 2067aabbc4fbSShri Abhyankar /*114*/ 0, 2068aabbc4fbSShri Abhyankar 0, 2069aabbc4fbSShri Abhyankar 0, 2070aabbc4fbSShri Abhyankar 0, 2071aabbc4fbSShri Abhyankar 0, 2072aabbc4fbSShri Abhyankar /*119*/ 0, 2073aabbc4fbSShri Abhyankar 0, 2074aabbc4fbSShri Abhyankar 0, 20750716a85fSBarry Smith 0, 20760716a85fSBarry Smith 0, 20770716a85fSBarry Smith /*124*/ 0, 20785df89d91SHong Zhang MatGetColumnNorms_SeqDense, 20795df89d91SHong Zhang 0, 20805df89d91SHong Zhang 0, 20815df89d91SHong Zhang 0, 20825df89d91SHong Zhang /*129*/ 0, 208375648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 208475648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 208575648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 2086985db425SBarry Smith }; 208790ace30eSBarry Smith 20884a2ae208SSatish Balay #undef __FUNCT__ 20894a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 20904b828684SBarry Smith /*@C 2091fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2092d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2093d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2094289bc588SBarry Smith 2095db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2096db81eaa0SLois Curfman McInnes 209720563c6bSBarry Smith Input Parameters: 2098db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 20990c775827SLois Curfman McInnes . m - number of rows 210018f449edSLois Curfman McInnes . n - number of columns 2101c0235b3cSMatthew Knepley - data - optional location of matrix data in column major order. Set data=PETSC_NULL for PETSc 2102dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 210320563c6bSBarry Smith 210420563c6bSBarry Smith Output Parameter: 210544cd7ae7SLois Curfman McInnes . A - the matrix 210620563c6bSBarry Smith 2107b259b22eSLois Curfman McInnes Notes: 210818f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 210918f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 2110b4fd4287SBarry Smith set data=PETSC_NULL. 211118f449edSLois Curfman McInnes 2112027ccd11SLois Curfman McInnes Level: intermediate 2113027ccd11SLois Curfman McInnes 2114dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 2115d65003e9SLois Curfman McInnes 211669b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 211720563c6bSBarry Smith @*/ 21187087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2119289bc588SBarry Smith { 2120dfbe8321SBarry Smith PetscErrorCode ierr; 21213b2fbd54SBarry Smith 21223a40ed3dSBarry Smith PetscFunctionBegin; 2123f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2124f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2125273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2126273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2127273d9f13SBarry Smith PetscFunctionReturn(0); 2128273d9f13SBarry Smith } 2129273d9f13SBarry Smith 21304a2ae208SSatish Balay #undef __FUNCT__ 2131afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 2132273d9f13SBarry Smith /*@C 2133273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2134273d9f13SBarry Smith 2135273d9f13SBarry Smith Collective on MPI_Comm 2136273d9f13SBarry Smith 2137273d9f13SBarry Smith Input Parameters: 2138273d9f13SBarry Smith + A - the matrix 2139273d9f13SBarry Smith - data - the array (or PETSC_NULL) 2140273d9f13SBarry Smith 2141273d9f13SBarry Smith Notes: 2142273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2143273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2144284134d9SBarry Smith need not call this routine. 2145273d9f13SBarry Smith 2146273d9f13SBarry Smith Level: intermediate 2147273d9f13SBarry Smith 2148273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2149273d9f13SBarry Smith 215069b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2151867c911aSBarry Smith 2152273d9f13SBarry Smith @*/ 21537087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2154273d9f13SBarry Smith { 21554ac538c5SBarry Smith PetscErrorCode ierr; 2156a23d5eceSKris Buschelman 2157a23d5eceSKris Buschelman PetscFunctionBegin; 21584ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2159a23d5eceSKris Buschelman PetscFunctionReturn(0); 2160a23d5eceSKris Buschelman } 2161a23d5eceSKris Buschelman 2162a23d5eceSKris Buschelman EXTERN_C_BEGIN 2163a23d5eceSKris Buschelman #undef __FUNCT__ 2164afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 21657087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2166a23d5eceSKris Buschelman { 2167273d9f13SBarry Smith Mat_SeqDense *b; 2168dfbe8321SBarry Smith PetscErrorCode ierr; 2169273d9f13SBarry Smith 2170273d9f13SBarry Smith PetscFunctionBegin; 2171273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2172a868139aSShri Abhyankar 217334ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 217434ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 217534ef9618SShri Abhyankar 2176273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 217786d161a7SShri Abhyankar b->Mmax = B->rmap->n; 217886d161a7SShri Abhyankar b->Nmax = B->cmap->n; 217986d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 218086d161a7SShri Abhyankar 21819e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 21829e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 21835afd5e0cSBarry Smith ierr = PetscMalloc(b->lda*b->Nmax*sizeof(PetscScalar),&b->v);CHKERRQ(ierr); 2184284134d9SBarry Smith ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 2185284134d9SBarry Smith ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 21869e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2187273d9f13SBarry Smith } else { /* user-allocated storage */ 21889e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2189273d9f13SBarry Smith b->v = data; 2190273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2191273d9f13SBarry Smith } 21920450473dSBarry Smith B->assembled = PETSC_TRUE; 2193273d9f13SBarry Smith PetscFunctionReturn(0); 2194273d9f13SBarry Smith } 2195a23d5eceSKris Buschelman EXTERN_C_END 2196273d9f13SBarry Smith 21971b807ce4Svictorle #undef __FUNCT__ 21981b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 21991b807ce4Svictorle /*@C 22001b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 22011b807ce4Svictorle 22021b807ce4Svictorle Input parameter: 22031b807ce4Svictorle + A - the matrix 22041b807ce4Svictorle - lda - the leading dimension 22051b807ce4Svictorle 22061b807ce4Svictorle Notes: 2207867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 22081b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 22091b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 22101b807ce4Svictorle 22111b807ce4Svictorle Level: intermediate 22121b807ce4Svictorle 22131b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 22141b807ce4Svictorle 2215284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2216867c911aSBarry Smith 22171b807ce4Svictorle @*/ 22187087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 22191b807ce4Svictorle { 22201b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 222121a2c019SBarry Smith 22221b807ce4Svictorle PetscFunctionBegin; 2223e32f2f54SBarry 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); 22241b807ce4Svictorle b->lda = lda; 222521a2c019SBarry Smith b->changelda = PETSC_FALSE; 222621a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 22271b807ce4Svictorle PetscFunctionReturn(0); 22281b807ce4Svictorle } 22291b807ce4Svictorle 22300bad9183SKris Buschelman /*MC 2231fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 22320bad9183SKris Buschelman 22330bad9183SKris Buschelman Options Database Keys: 22340bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 22350bad9183SKris Buschelman 22360bad9183SKris Buschelman Level: beginner 22370bad9183SKris Buschelman 223889665df3SBarry Smith .seealso: MatCreateSeqDense() 223989665df3SBarry Smith 22400bad9183SKris Buschelman M*/ 22410bad9183SKris Buschelman 2242273d9f13SBarry Smith EXTERN_C_BEGIN 22434a2ae208SSatish Balay #undef __FUNCT__ 22444a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 22457087cfbeSBarry Smith PetscErrorCode MatCreate_SeqDense(Mat B) 2246273d9f13SBarry Smith { 2247273d9f13SBarry Smith Mat_SeqDense *b; 2248dfbe8321SBarry Smith PetscErrorCode ierr; 22497c334f02SBarry Smith PetscMPIInt size; 2250273d9f13SBarry Smith 2251273d9f13SBarry Smith PetscFunctionBegin; 22527adad957SLisandro Dalcin ierr = MPI_Comm_size(((PetscObject)B)->comm,&size);CHKERRQ(ierr); 2253e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 225455659b69SBarry Smith 225538f2d2fdSLisandro Dalcin ierr = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr); 2256549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 225744cd7ae7SLois Curfman McInnes B->data = (void*)b; 225818f449edSLois Curfman McInnes 225944cd7ae7SLois Curfman McInnes b->pivots = 0; 2260273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2261273d9f13SBarry Smith b->v = 0; 226221a2c019SBarry Smith b->changelda = PETSC_FALSE; 22634e220ebcSLois Curfman McInnes 22648c778c55SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatDenseGetArray_C","MatDenseGetArray_SeqDense",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 22658c778c55SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatDenseRestoreArray_C","MatDenseRestoreArray_SeqDense",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2266b24902e0SBarry Smith 22676a63e612SBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatConvert_seqdense_seqaij_C","MatConvert_SeqDense_SeqAIJ",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 2268ec1065edSBarry Smith ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatGetFactor_petsc_C", 2269b24902e0SBarry Smith "MatGetFactor_seqdense_petsc", 2270b24902e0SBarry Smith MatGetFactor_seqdense_petsc);CHKERRQ(ierr); 2271a23d5eceSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C", 2272a23d5eceSKris Buschelman "MatSeqDenseSetPreallocation_SeqDense", 2273a23d5eceSKris Buschelman MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 22742356f84bSDmitry Karpeev 22754ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqaij_seqdense_C", 22764ae313f4SHong Zhang "MatMatMult_SeqAIJ_SeqDense", 22774ae313f4SHong Zhang MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 22782356f84bSDmitry Karpeev 2279c0c8ee5eSDmitry Karpeev 22804ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C", 22814ae313f4SHong Zhang "MatMatMultSymbolic_SeqAIJ_SeqDense", 22824ae313f4SHong Zhang MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 22834ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C", 22844ae313f4SHong Zhang "MatMatMultNumeric_SeqAIJ_SeqDense", 22854ae313f4SHong Zhang MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 228617667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 22873a40ed3dSBarry Smith PetscFunctionReturn(0); 2288289bc588SBarry Smith } 2289273d9f13SBarry Smith EXTERN_C_END 2290