1be1d678aSKris Buschelman 267e560aaSBarry Smith /* 367e560aaSBarry Smith Defines the basic matrix operations for sequential dense. 467e560aaSBarry Smith */ 5289bc588SBarry Smith 6dec5eb66SMatthew G Knepley #include <../src/mat/impls/dense/seq/dense.h> /*I "petscmat.h" I*/ 7c6db04a5SJed Brown #include <petscblaslapack.h> 8289bc588SBarry Smith 96a63e612SBarry Smith #include <../src/mat/impls/aij/seq/aij.h> 10b2573a8aSBarry Smith 116a63e612SBarry Smith #undef __FUNCT__ 12abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAPNumeric_SeqDense_SeqDense" 13abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C) 14abc3b08eSStefano Zampini { 15abc3b08eSStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)(C->data); 16abc3b08eSStefano Zampini PetscErrorCode ierr; 17abc3b08eSStefano Zampini 18abc3b08eSStefano Zampini PetscFunctionBegin; 19abc3b08eSStefano Zampini ierr = MatMatMultNumeric_SeqDense_SeqDense(A,P,c->ptapwork);CHKERRQ(ierr); 20abc3b08eSStefano Zampini ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(P,c->ptapwork,C);CHKERRQ(ierr); 21abc3b08eSStefano Zampini PetscFunctionReturn(0); 22abc3b08eSStefano Zampini } 23abc3b08eSStefano Zampini 24abc3b08eSStefano Zampini #undef __FUNCT__ 25abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAPSymbolic_SeqDense_SeqDense" 26abc3b08eSStefano Zampini PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat *C) 27abc3b08eSStefano Zampini { 28abc3b08eSStefano Zampini Mat_SeqDense *c; 29abc3b08eSStefano Zampini PetscErrorCode ierr; 30abc3b08eSStefano Zampini 31abc3b08eSStefano Zampini PetscFunctionBegin; 32abc3b08eSStefano Zampini ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),P->cmap->N,P->cmap->N,NULL,C);CHKERRQ(ierr); 33abc3b08eSStefano Zampini c = (Mat_SeqDense*)((*C)->data); 34abc3b08eSStefano Zampini ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),A->rmap->N,P->cmap->N,NULL,&c->ptapwork);CHKERRQ(ierr); 35abc3b08eSStefano Zampini PetscFunctionReturn(0); 36abc3b08eSStefano Zampini } 37abc3b08eSStefano Zampini 38abc3b08eSStefano Zampini #undef __FUNCT__ 39abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAP_SeqDense_SeqDense" 40abc3b08eSStefano Zampini PETSC_EXTERN PetscErrorCode MatPtAP_SeqDense_SeqDense(Mat A,Mat P,MatReuse reuse,PetscReal fill,Mat *C) 41abc3b08eSStefano Zampini { 42abc3b08eSStefano Zampini PetscErrorCode ierr; 43abc3b08eSStefano Zampini 44abc3b08eSStefano Zampini PetscFunctionBegin; 45abc3b08eSStefano Zampini if (reuse == MAT_INITIAL_MATRIX) { 46abc3b08eSStefano Zampini ierr = MatPtAPSymbolic_SeqDense_SeqDense(A,P,fill,C);CHKERRQ(ierr); 47abc3b08eSStefano Zampini } 48abc3b08eSStefano Zampini ierr = PetscLogEventBegin(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 49abc3b08eSStefano Zampini ierr = (*(*C)->ops->ptapnumeric)(A,P,*C);CHKERRQ(ierr); 50abc3b08eSStefano Zampini ierr = PetscLogEventEnd(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 51abc3b08eSStefano Zampini PetscFunctionReturn(0); 52abc3b08eSStefano Zampini } 53abc3b08eSStefano Zampini 54abc3b08eSStefano Zampini #undef __FUNCT__ 55b49cda9fSStefano Zampini #define __FUNCT__ "MatConvert_SeqAIJ_SeqDense" 56b49cda9fSStefano Zampini PETSC_EXTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat) 57b49cda9fSStefano Zampini { 58b49cda9fSStefano Zampini Mat B; 59b49cda9fSStefano Zampini Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 60b49cda9fSStefano Zampini Mat_SeqDense *b; 61b49cda9fSStefano Zampini PetscErrorCode ierr; 62b49cda9fSStefano Zampini PetscInt *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i; 63b49cda9fSStefano Zampini MatScalar *av=a->a; 64b49cda9fSStefano Zampini 65b49cda9fSStefano Zampini PetscFunctionBegin; 66b49cda9fSStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 67b49cda9fSStefano Zampini ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr); 68b49cda9fSStefano Zampini ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr); 69b49cda9fSStefano Zampini ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr); 70b49cda9fSStefano Zampini 71b49cda9fSStefano Zampini b = (Mat_SeqDense*)(B->data); 72b49cda9fSStefano Zampini for (i=0; i<m; i++) { 73b49cda9fSStefano Zampini PetscInt j; 74b49cda9fSStefano Zampini for (j=0;j<ai[1]-ai[0];j++) { 75b49cda9fSStefano Zampini b->v[*aj*m+i] = *av; 76b49cda9fSStefano Zampini aj++; 77b49cda9fSStefano Zampini av++; 78b49cda9fSStefano Zampini } 79b49cda9fSStefano Zampini ai++; 80b49cda9fSStefano Zampini } 81b49cda9fSStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 82b49cda9fSStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 83b49cda9fSStefano Zampini 84511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 8528be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 86b49cda9fSStefano Zampini } else { 87b49cda9fSStefano Zampini *newmat = B; 88b49cda9fSStefano Zampini } 89b49cda9fSStefano Zampini PetscFunctionReturn(0); 90b49cda9fSStefano Zampini } 91b49cda9fSStefano Zampini 92b49cda9fSStefano Zampini #undef __FUNCT__ 936a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ" 948cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 956a63e612SBarry Smith { 966a63e612SBarry Smith Mat B; 976a63e612SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 986a63e612SBarry Smith PetscErrorCode ierr; 999399e1b8SMatthew G. Knepley PetscInt i, j; 1009399e1b8SMatthew G. Knepley PetscInt *rows, *nnz; 1019399e1b8SMatthew G. Knepley MatScalar *aa = a->v, *vals; 1026a63e612SBarry Smith 1036a63e612SBarry Smith PetscFunctionBegin; 104ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 1056a63e612SBarry Smith ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 1066a63e612SBarry Smith ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr); 1079399e1b8SMatthew G. Knepley ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr); 1089399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 1099399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i]; 1106a63e612SBarry Smith aa += a->lda; 1116a63e612SBarry Smith } 1129399e1b8SMatthew G. Knepley ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr); 1139399e1b8SMatthew G. Knepley aa = a->v; 1149399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 1159399e1b8SMatthew G. Knepley PetscInt numRows = 0; 1169399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];} 1179399e1b8SMatthew G. Knepley ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr); 1189399e1b8SMatthew G. Knepley aa += a->lda; 1199399e1b8SMatthew G. Knepley } 1209399e1b8SMatthew G. Knepley ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr); 1216a63e612SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1226a63e612SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1236a63e612SBarry Smith 124511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 12528be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 1266a63e612SBarry Smith } else { 1276a63e612SBarry Smith *newmat = B; 1286a63e612SBarry Smith } 1296a63e612SBarry Smith PetscFunctionReturn(0); 1306a63e612SBarry Smith } 1316a63e612SBarry Smith 1324a2ae208SSatish Balay #undef __FUNCT__ 1334a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense" 134*e0877f53SBarry Smith static PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 1351987afe7SBarry Smith { 1361987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 137f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 13813f74950SBarry Smith PetscInt j; 1390805154bSBarry Smith PetscBLASInt N,m,ldax,lday,one = 1; 140efee365bSSatish Balay PetscErrorCode ierr; 1413a40ed3dSBarry Smith 1423a40ed3dSBarry Smith PetscFunctionBegin; 143c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr); 144c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr); 145c5df96a5SBarry Smith ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr); 146c5df96a5SBarry Smith ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr); 147a5ce6ee0Svictorle if (ldax>m || lday>m) { 148d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 1498b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one)); 150a5ce6ee0Svictorle } 151a5ce6ee0Svictorle } else { 1528b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one)); 153a5ce6ee0Svictorle } 154a3fa217bSJose E. Roman ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr); 1550450473dSBarry Smith ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr); 1563a40ed3dSBarry Smith PetscFunctionReturn(0); 1571987afe7SBarry Smith } 1581987afe7SBarry Smith 1594a2ae208SSatish Balay #undef __FUNCT__ 1604a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense" 161*e0877f53SBarry Smith static PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 162289bc588SBarry Smith { 163d0f46423SBarry Smith PetscInt N = A->rmap->n*A->cmap->n; 1643a40ed3dSBarry Smith 1653a40ed3dSBarry Smith PetscFunctionBegin; 1664e220ebcSLois Curfman McInnes info->block_size = 1.0; 1674e220ebcSLois Curfman McInnes info->nz_allocated = (double)N; 1686de62eeeSBarry Smith info->nz_used = (double)N; 1696de62eeeSBarry Smith info->nz_unneeded = (double)0; 1704e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 1714e220ebcSLois Curfman McInnes info->mallocs = 0; 1727adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 1734e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 1744e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 1754e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 1763a40ed3dSBarry Smith PetscFunctionReturn(0); 177289bc588SBarry Smith } 178289bc588SBarry Smith 1794a2ae208SSatish Balay #undef __FUNCT__ 1804a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense" 181*e0877f53SBarry Smith static PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 18280cd9d93SLois Curfman McInnes { 183273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 184f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 185efee365bSSatish Balay PetscErrorCode ierr; 186c5df96a5SBarry Smith PetscBLASInt one = 1,j,nz,lda; 18780cd9d93SLois Curfman McInnes 1883a40ed3dSBarry Smith PetscFunctionBegin; 189c5df96a5SBarry Smith ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr); 190d0f46423SBarry Smith if (lda>A->rmap->n) { 191c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr); 192d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1938b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one)); 194a5ce6ee0Svictorle } 195a5ce6ee0Svictorle } else { 196c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr); 1978b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one)); 198a5ce6ee0Svictorle } 199efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 2003a40ed3dSBarry Smith PetscFunctionReturn(0); 20180cd9d93SLois Curfman McInnes } 20280cd9d93SLois Curfman McInnes 2031cbb95d3SBarry Smith #undef __FUNCT__ 2041cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense" 205*e0877f53SBarry Smith static PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 2061cbb95d3SBarry Smith { 2071cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 208d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,N; 2091cbb95d3SBarry Smith PetscScalar *v = a->v; 2101cbb95d3SBarry Smith 2111cbb95d3SBarry Smith PetscFunctionBegin; 2121cbb95d3SBarry Smith *fl = PETSC_FALSE; 213d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 2141cbb95d3SBarry Smith N = a->lda; 2151cbb95d3SBarry Smith 2161cbb95d3SBarry Smith for (i=0; i<m; i++) { 2171cbb95d3SBarry Smith for (j=i+1; j<m; j++) { 2181cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 2191cbb95d3SBarry Smith } 2201cbb95d3SBarry Smith } 2211cbb95d3SBarry Smith *fl = PETSC_TRUE; 2221cbb95d3SBarry Smith PetscFunctionReturn(0); 2231cbb95d3SBarry Smith } 2241cbb95d3SBarry Smith 225b24902e0SBarry Smith #undef __FUNCT__ 226b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense" 227*e0877f53SBarry Smith static PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 228b24902e0SBarry Smith { 229b24902e0SBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 230b24902e0SBarry Smith PetscErrorCode ierr; 231b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 232b24902e0SBarry Smith 233b24902e0SBarry Smith PetscFunctionBegin; 234aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr); 235aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr); 2360298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr); 237b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 238b24902e0SBarry Smith l = (Mat_SeqDense*)newi->data; 239d0f46423SBarry Smith if (lda>A->rmap->n) { 240d0f46423SBarry Smith m = A->rmap->n; 241d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 242b24902e0SBarry Smith ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 243b24902e0SBarry Smith } 244b24902e0SBarry Smith } else { 245d0f46423SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 246b24902e0SBarry Smith } 247b24902e0SBarry Smith } 248b24902e0SBarry Smith newi->assembled = PETSC_TRUE; 249b24902e0SBarry Smith PetscFunctionReturn(0); 250b24902e0SBarry Smith } 251b24902e0SBarry Smith 2524a2ae208SSatish Balay #undef __FUNCT__ 2534a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense" 254*e0877f53SBarry Smith static PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 25502cad45dSBarry Smith { 2566849ba73SBarry Smith PetscErrorCode ierr; 25702cad45dSBarry Smith 2583a40ed3dSBarry Smith PetscFunctionBegin; 259ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr); 260d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 2615c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 262719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 263b24902e0SBarry Smith PetscFunctionReturn(0); 264b24902e0SBarry Smith } 265b24902e0SBarry Smith 2666ee01492SSatish Balay 267*e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*); 268719d5645SBarry Smith 2694a2ae208SSatish Balay #undef __FUNCT__ 2704a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense" 271*e0877f53SBarry Smith static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 272289bc588SBarry Smith { 2734482741eSBarry Smith MatFactorInfo info; 274a093e273SMatthew Knepley PetscErrorCode ierr; 2753a40ed3dSBarry Smith 2763a40ed3dSBarry Smith PetscFunctionBegin; 277c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 278719d5645SBarry Smith ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr); 2793a40ed3dSBarry Smith PetscFunctionReturn(0); 280289bc588SBarry Smith } 2816ee01492SSatish Balay 2820b4b3355SBarry Smith #undef __FUNCT__ 2834a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense" 284*e0877f53SBarry Smith static PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 285289bc588SBarry Smith { 286c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 2876849ba73SBarry Smith PetscErrorCode ierr; 288f1ceaac6SMatthew G. Knepley const PetscScalar *x; 289f1ceaac6SMatthew G. Knepley PetscScalar *y; 290c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 29167e560aaSBarry Smith 2923a40ed3dSBarry Smith PetscFunctionBegin; 293c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 294f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 2951ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 296d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 297d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 298ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 299e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 300ae7cfcebSSatish Balay #else 3018b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 302e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 303ae7cfcebSSatish Balay #endif 304d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 305ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 306e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 307ae7cfcebSSatish Balay #else 3088b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 309e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 310ae7cfcebSSatish Balay #endif 3112205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 312f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 3131ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 314dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 3153a40ed3dSBarry Smith PetscFunctionReturn(0); 316289bc588SBarry Smith } 3176ee01492SSatish Balay 3184a2ae208SSatish Balay #undef __FUNCT__ 31985e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense" 320*e0877f53SBarry Smith static PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 32185e2c93fSHong Zhang { 32285e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 32385e2c93fSHong Zhang PetscErrorCode ierr; 32485e2c93fSHong Zhang PetscScalar *b,*x; 325efb80c78SLisandro Dalcin PetscInt n; 326783b601eSJed Brown PetscBLASInt nrhs,info,m; 327bda8bf91SBarry Smith PetscBool flg; 32885e2c93fSHong Zhang 32985e2c93fSHong Zhang PetscFunctionBegin; 330c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 3310298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 332ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix"); 3330298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 334ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix"); 335bda8bf91SBarry Smith 3360298fd71SBarry Smith ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr); 337c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr); 3388c778c55SBarry Smith ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr); 3398c778c55SBarry Smith ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr); 34085e2c93fSHong Zhang 341f272c775SHong Zhang ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr); 34285e2c93fSHong Zhang 34385e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 34485e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS) 34585e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 34685e2c93fSHong Zhang #else 3478b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 34885e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 34985e2c93fSHong Zhang #endif 35085e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 35185e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS) 35285e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 35385e2c93fSHong Zhang #else 3548b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info)); 35585e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 35685e2c93fSHong Zhang #endif 3572205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 35885e2c93fSHong Zhang 3598c778c55SBarry Smith ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr); 3608c778c55SBarry Smith ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr); 36185e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 36285e2c93fSHong Zhang PetscFunctionReturn(0); 36385e2c93fSHong Zhang } 36485e2c93fSHong Zhang 36585e2c93fSHong Zhang #undef __FUNCT__ 3664a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense" 367*e0877f53SBarry Smith static PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 368da3a660dSBarry Smith { 369c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 370dfbe8321SBarry Smith PetscErrorCode ierr; 371f1ceaac6SMatthew G. Knepley const PetscScalar *x; 372f1ceaac6SMatthew G. Knepley PetscScalar *y; 373c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 37467e560aaSBarry Smith 3753a40ed3dSBarry Smith PetscFunctionBegin; 376c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 377f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 3781ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 379d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 380752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 381da3a660dSBarry Smith if (mat->pivots) { 382ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 383e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 384ae7cfcebSSatish Balay #else 3858b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 386e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 387ae7cfcebSSatish Balay #endif 3887a97a34bSBarry Smith } else { 389ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 390e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 391ae7cfcebSSatish Balay #else 3928b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 393e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 394ae7cfcebSSatish Balay #endif 395da3a660dSBarry Smith } 396f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 3971ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 398dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 3993a40ed3dSBarry Smith PetscFunctionReturn(0); 400da3a660dSBarry Smith } 4016ee01492SSatish Balay 4024a2ae208SSatish Balay #undef __FUNCT__ 4034a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense" 404*e0877f53SBarry Smith static PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 405da3a660dSBarry Smith { 406c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 407dfbe8321SBarry Smith PetscErrorCode ierr; 408f1ceaac6SMatthew G. Knepley const PetscScalar *x; 409f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 410da3a660dSBarry Smith Vec tmp = 0; 411c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 41267e560aaSBarry Smith 4133a40ed3dSBarry Smith PetscFunctionBegin; 414c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 415f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4161ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 417d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 418da3a660dSBarry Smith if (yy == zz) { 41978b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 4203bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 42178b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 422da3a660dSBarry Smith } 423d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 424752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 425da3a660dSBarry Smith if (mat->pivots) { 426ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 427e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 428ae7cfcebSSatish Balay #else 4298b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 430e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 431ae7cfcebSSatish Balay #endif 432a8c6a408SBarry Smith } else { 433ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 434e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 435ae7cfcebSSatish Balay #else 4368b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 437e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 438ae7cfcebSSatish Balay #endif 439da3a660dSBarry Smith } 4406bf464f9SBarry Smith if (tmp) { 4416bf464f9SBarry Smith ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 4426bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 4436bf464f9SBarry Smith } else { 4446bf464f9SBarry Smith ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 4456bf464f9SBarry Smith } 446f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4471ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 448dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 4493a40ed3dSBarry Smith PetscFunctionReturn(0); 450da3a660dSBarry Smith } 45167e560aaSBarry Smith 4524a2ae208SSatish Balay #undef __FUNCT__ 4534a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense" 454*e0877f53SBarry Smith static PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 455da3a660dSBarry Smith { 456c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 4576849ba73SBarry Smith PetscErrorCode ierr; 458f1ceaac6SMatthew G. Knepley const PetscScalar *x; 459f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 460da3a660dSBarry Smith Vec tmp; 461c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 46267e560aaSBarry Smith 4633a40ed3dSBarry Smith PetscFunctionBegin; 464c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 465d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 466f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4671ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 468da3a660dSBarry Smith if (yy == zz) { 46978b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 4703bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 47178b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 472da3a660dSBarry Smith } 473d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 474752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 475da3a660dSBarry Smith if (mat->pivots) { 476ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 477e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 478ae7cfcebSSatish Balay #else 4798b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 480e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 481ae7cfcebSSatish Balay #endif 4823a40ed3dSBarry Smith } else { 483ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 484e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 485ae7cfcebSSatish Balay #else 4868b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 487e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 488ae7cfcebSSatish Balay #endif 489da3a660dSBarry Smith } 49090f02eecSBarry Smith if (tmp) { 4912dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 4926bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 4933a40ed3dSBarry Smith } else { 4942dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 49590f02eecSBarry Smith } 496f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4971ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 498dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 4993a40ed3dSBarry Smith PetscFunctionReturn(0); 500da3a660dSBarry Smith } 501db4efbfdSBarry Smith 502db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 503db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 504db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 505db4efbfdSBarry Smith #undef __FUNCT__ 506db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense" 507*e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 508db4efbfdSBarry Smith { 509db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 510db4efbfdSBarry Smith PetscFunctionBegin; 511e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 512db4efbfdSBarry Smith #else 513db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 514db4efbfdSBarry Smith PetscErrorCode ierr; 515db4efbfdSBarry Smith PetscBLASInt n,m,info; 516db4efbfdSBarry Smith 517db4efbfdSBarry Smith PetscFunctionBegin; 518c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 519c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 520db4efbfdSBarry Smith if (!mat->pivots) { 521854ce69bSBarry Smith ierr = PetscMalloc1(A->rmap->n+1,&mat->pivots);CHKERRQ(ierr); 5223bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 523db4efbfdSBarry Smith } 524db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5258e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5268b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info)); 5278e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 5288e57ea43SSatish Balay 529e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 530e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 531db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 532db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 533db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 534db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 535d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 536db4efbfdSBarry Smith 537dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 538db4efbfdSBarry Smith #endif 539db4efbfdSBarry Smith PetscFunctionReturn(0); 540db4efbfdSBarry Smith } 541db4efbfdSBarry Smith 542db4efbfdSBarry Smith #undef __FUNCT__ 543db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense" 544*e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 545db4efbfdSBarry Smith { 546db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 547db4efbfdSBarry Smith PetscFunctionBegin; 548e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 549db4efbfdSBarry Smith #else 550db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 551db4efbfdSBarry Smith PetscErrorCode ierr; 552c5df96a5SBarry Smith PetscBLASInt info,n; 553db4efbfdSBarry Smith 554db4efbfdSBarry Smith PetscFunctionBegin; 555c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 556db4efbfdSBarry Smith ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 557db4efbfdSBarry Smith 558db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5598b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info)); 560e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 561db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 562db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 563db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 564db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 565d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 5662205254eSKarl Rupp 567eb3f19e4SBarry Smith ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 568db4efbfdSBarry Smith #endif 569db4efbfdSBarry Smith PetscFunctionReturn(0); 570db4efbfdSBarry Smith } 571db4efbfdSBarry Smith 572db4efbfdSBarry Smith 573db4efbfdSBarry Smith #undef __FUNCT__ 574db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense" 5750481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 576db4efbfdSBarry Smith { 577db4efbfdSBarry Smith PetscErrorCode ierr; 578db4efbfdSBarry Smith MatFactorInfo info; 579db4efbfdSBarry Smith 580db4efbfdSBarry Smith PetscFunctionBegin; 581db4efbfdSBarry Smith info.fill = 1.0; 5822205254eSKarl Rupp 583c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 584719d5645SBarry Smith ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr); 585db4efbfdSBarry Smith PetscFunctionReturn(0); 586db4efbfdSBarry Smith } 587db4efbfdSBarry Smith 588db4efbfdSBarry Smith #undef __FUNCT__ 589db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense" 590*e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 591db4efbfdSBarry Smith { 592db4efbfdSBarry Smith PetscFunctionBegin; 593c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 5941bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 595719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 596db4efbfdSBarry Smith PetscFunctionReturn(0); 597db4efbfdSBarry Smith } 598db4efbfdSBarry Smith 599db4efbfdSBarry Smith #undef __FUNCT__ 600db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense" 601*e0877f53SBarry Smith static PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 602db4efbfdSBarry Smith { 603db4efbfdSBarry Smith PetscFunctionBegin; 604b66fe19dSMatthew G Knepley fact->preallocated = PETSC_TRUE; 605c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 606719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 607db4efbfdSBarry Smith PetscFunctionReturn(0); 608db4efbfdSBarry Smith } 609db4efbfdSBarry Smith 610db4efbfdSBarry Smith #undef __FUNCT__ 611db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc" 6128cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 613db4efbfdSBarry Smith { 614db4efbfdSBarry Smith PetscErrorCode ierr; 615db4efbfdSBarry Smith 616db4efbfdSBarry Smith PetscFunctionBegin; 617ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr); 618db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 619db4efbfdSBarry Smith ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr); 620db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU) { 621db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 622db4efbfdSBarry Smith } else { 623db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 624db4efbfdSBarry Smith } 625d5f3da31SBarry Smith (*fact)->factortype = ftype; 626db4efbfdSBarry Smith PetscFunctionReturn(0); 627db4efbfdSBarry Smith } 628db4efbfdSBarry Smith 629289bc588SBarry Smith /* ------------------------------------------------------------------*/ 6304a2ae208SSatish Balay #undef __FUNCT__ 63141f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense" 632*e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 633289bc588SBarry Smith { 634c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 635d9ca1df4SBarry Smith PetscScalar *x,*v = mat->v,zero = 0.0,xt; 636d9ca1df4SBarry Smith const PetscScalar *b; 637dfbe8321SBarry Smith PetscErrorCode ierr; 638d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 639c5df96a5SBarry Smith PetscBLASInt o = 1,bm; 640289bc588SBarry Smith 6413a40ed3dSBarry Smith PetscFunctionBegin; 642422a814eSBarry Smith if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */ 643c5df96a5SBarry Smith ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr); 644289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 64571044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 6462dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 647289bc588SBarry Smith } 6481ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 649d9ca1df4SBarry Smith ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr); 650b965ef7fSBarry Smith its = its*lits; 651e32f2f54SBarry 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); 652289bc588SBarry Smith while (its--) { 653fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 654289bc588SBarry Smith for (i=0; i<m; i++) { 6558b83055fSJed Brown PetscStackCallBLAS("BLASdot",xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o)); 65655a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 657289bc588SBarry Smith } 658289bc588SBarry Smith } 659fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 660289bc588SBarry Smith for (i=m-1; i>=0; i--) { 6618b83055fSJed Brown PetscStackCallBLAS("BLASdot",xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o)); 66255a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 663289bc588SBarry Smith } 664289bc588SBarry Smith } 665289bc588SBarry Smith } 666d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr); 6671ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6683a40ed3dSBarry Smith PetscFunctionReturn(0); 669289bc588SBarry Smith } 670289bc588SBarry Smith 671289bc588SBarry Smith /* -----------------------------------------------------------------*/ 6724a2ae208SSatish Balay #undef __FUNCT__ 6734a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense" 674*e0877f53SBarry Smith static PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 675289bc588SBarry Smith { 676c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 677d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 678d9ca1df4SBarry Smith PetscScalar *y; 679dfbe8321SBarry Smith PetscErrorCode ierr; 6800805154bSBarry Smith PetscBLASInt m, n,_One=1; 681ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 6823a40ed3dSBarry Smith 6833a40ed3dSBarry Smith PetscFunctionBegin; 684c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 685c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 686d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 687d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 6881ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 6898b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One)); 690d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 6911ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 692dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 6933a40ed3dSBarry Smith PetscFunctionReturn(0); 694289bc588SBarry Smith } 695800995b7SMatthew Knepley 6964a2ae208SSatish Balay #undef __FUNCT__ 6974a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense" 698*e0877f53SBarry Smith static PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 699289bc588SBarry Smith { 700c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 701d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0,_DZero=0.0; 702dfbe8321SBarry Smith PetscErrorCode ierr; 7030805154bSBarry Smith PetscBLASInt m, n, _One=1; 704d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 7053a40ed3dSBarry Smith 7063a40ed3dSBarry Smith PetscFunctionBegin; 707c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 708c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 709d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 710d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 7111ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 7128b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One)); 713d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 7141ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 715dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 7163a40ed3dSBarry Smith PetscFunctionReturn(0); 717289bc588SBarry Smith } 7186ee01492SSatish Balay 7194a2ae208SSatish Balay #undef __FUNCT__ 7204a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense" 721*e0877f53SBarry Smith static PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 722289bc588SBarry Smith { 723c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 724d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 725d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0; 726dfbe8321SBarry Smith PetscErrorCode ierr; 7270805154bSBarry Smith PetscBLASInt m, n, _One=1; 7283a40ed3dSBarry Smith 7293a40ed3dSBarry Smith PetscFunctionBegin; 730c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 731c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 732d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 733600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 734d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 7351ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 7368b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 737d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 7381ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 739dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 7403a40ed3dSBarry Smith PetscFunctionReturn(0); 741289bc588SBarry Smith } 7426ee01492SSatish Balay 7434a2ae208SSatish Balay #undef __FUNCT__ 7444a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense" 745*e0877f53SBarry Smith static PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 746289bc588SBarry Smith { 747c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 748d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 749d9ca1df4SBarry Smith PetscScalar *y; 750dfbe8321SBarry Smith PetscErrorCode ierr; 7510805154bSBarry Smith PetscBLASInt m, n, _One=1; 75287828ca2SBarry Smith PetscScalar _DOne=1.0; 7533a40ed3dSBarry Smith 7543a40ed3dSBarry Smith PetscFunctionBegin; 755c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 756c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 757d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 758600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 759d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 7601ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 7618b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 762d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 7631ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 764dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 7653a40ed3dSBarry Smith PetscFunctionReturn(0); 766289bc588SBarry Smith } 767289bc588SBarry Smith 768289bc588SBarry Smith /* -----------------------------------------------------------------*/ 7694a2ae208SSatish Balay #undef __FUNCT__ 7704a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense" 771*e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 772289bc588SBarry Smith { 773c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 77487828ca2SBarry Smith PetscScalar *v; 7756849ba73SBarry Smith PetscErrorCode ierr; 77613f74950SBarry Smith PetscInt i; 77767e560aaSBarry Smith 7783a40ed3dSBarry Smith PetscFunctionBegin; 779d0f46423SBarry Smith *ncols = A->cmap->n; 780289bc588SBarry Smith if (cols) { 781854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr); 782d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 783289bc588SBarry Smith } 784289bc588SBarry Smith if (vals) { 785854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr); 786289bc588SBarry Smith v = mat->v + row; 787d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 788289bc588SBarry Smith } 7893a40ed3dSBarry Smith PetscFunctionReturn(0); 790289bc588SBarry Smith } 7916ee01492SSatish Balay 7924a2ae208SSatish Balay #undef __FUNCT__ 7934a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense" 794*e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 795289bc588SBarry Smith { 796dfbe8321SBarry Smith PetscErrorCode ierr; 7976e111a19SKarl Rupp 798606d414cSSatish Balay PetscFunctionBegin; 799606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 800606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 8013a40ed3dSBarry Smith PetscFunctionReturn(0); 802289bc588SBarry Smith } 803289bc588SBarry Smith /* ----------------------------------------------------------------*/ 8044a2ae208SSatish Balay #undef __FUNCT__ 8054a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense" 806*e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 807289bc588SBarry Smith { 808c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 80913f74950SBarry Smith PetscInt i,j,idx=0; 810d6dfbf8fSBarry Smith 8113a40ed3dSBarry Smith PetscFunctionBegin; 812289bc588SBarry Smith if (!mat->roworiented) { 813dbb450caSBarry Smith if (addv == INSERT_VALUES) { 814289bc588SBarry Smith for (j=0; j<n; j++) { 815cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 8162515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 817e32f2f54SBarry 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); 81858804f6dSBarry Smith #endif 819289bc588SBarry Smith for (i=0; i<m; i++) { 820cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 8212515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 822e32f2f54SBarry 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); 82358804f6dSBarry Smith #endif 824cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 825289bc588SBarry Smith } 826289bc588SBarry Smith } 8273a40ed3dSBarry Smith } else { 828289bc588SBarry Smith for (j=0; j<n; j++) { 829cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 8302515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 831e32f2f54SBarry 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); 83258804f6dSBarry Smith #endif 833289bc588SBarry Smith for (i=0; i<m; i++) { 834cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 8352515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 836e32f2f54SBarry 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); 83758804f6dSBarry Smith #endif 838cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 839289bc588SBarry Smith } 840289bc588SBarry Smith } 841289bc588SBarry Smith } 8423a40ed3dSBarry Smith } else { 843dbb450caSBarry Smith if (addv == INSERT_VALUES) { 844e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 845cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 8462515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 847e32f2f54SBarry 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); 84858804f6dSBarry Smith #endif 849e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 850cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 8512515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 852e32f2f54SBarry 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); 85358804f6dSBarry Smith #endif 854cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 855e8d4e0b9SBarry Smith } 856e8d4e0b9SBarry Smith } 8573a40ed3dSBarry Smith } else { 858289bc588SBarry Smith for (i=0; i<m; i++) { 859cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 8602515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 861e32f2f54SBarry 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); 86258804f6dSBarry Smith #endif 863289bc588SBarry Smith for (j=0; j<n; j++) { 864cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 8652515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 866e32f2f54SBarry 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); 86758804f6dSBarry Smith #endif 868cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 869289bc588SBarry Smith } 870289bc588SBarry Smith } 871289bc588SBarry Smith } 872e8d4e0b9SBarry Smith } 8733a40ed3dSBarry Smith PetscFunctionReturn(0); 874289bc588SBarry Smith } 875e8d4e0b9SBarry Smith 8764a2ae208SSatish Balay #undef __FUNCT__ 8774a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense" 878*e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 879ae80bb75SLois Curfman McInnes { 880ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 88113f74950SBarry Smith PetscInt i,j; 882ae80bb75SLois Curfman McInnes 8833a40ed3dSBarry Smith PetscFunctionBegin; 884ae80bb75SLois Curfman McInnes /* row-oriented output */ 885ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 88697e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 887e32f2f54SBarry 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); 888ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 8896f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 890e32f2f54SBarry 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); 89197e567efSBarry Smith *v++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 892ae80bb75SLois Curfman McInnes } 893ae80bb75SLois Curfman McInnes } 8943a40ed3dSBarry Smith PetscFunctionReturn(0); 895ae80bb75SLois Curfman McInnes } 896ae80bb75SLois Curfman McInnes 897289bc588SBarry Smith /* -----------------------------------------------------------------*/ 898289bc588SBarry Smith 8994a2ae208SSatish Balay #undef __FUNCT__ 9005bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense" 901*e0877f53SBarry Smith static PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer) 902aabbc4fbSShri Abhyankar { 903aabbc4fbSShri Abhyankar Mat_SeqDense *a; 904aabbc4fbSShri Abhyankar PetscErrorCode ierr; 905aabbc4fbSShri Abhyankar PetscInt *scols,i,j,nz,header[4]; 906aabbc4fbSShri Abhyankar int fd; 907aabbc4fbSShri Abhyankar PetscMPIInt size; 908aabbc4fbSShri Abhyankar PetscInt *rowlengths = 0,M,N,*cols,grows,gcols; 909aabbc4fbSShri Abhyankar PetscScalar *vals,*svals,*v,*w; 910ce94432eSBarry Smith MPI_Comm comm; 911aabbc4fbSShri Abhyankar 912aabbc4fbSShri Abhyankar PetscFunctionBegin; 913c98fd787SBarry Smith /* force binary viewer to load .info file if it has not yet done so */ 914c98fd787SBarry Smith ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 915ce94432eSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 916aabbc4fbSShri Abhyankar ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 917aabbc4fbSShri Abhyankar if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor"); 918aabbc4fbSShri Abhyankar ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 919aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 920aabbc4fbSShri Abhyankar if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 921aabbc4fbSShri Abhyankar M = header[1]; N = header[2]; nz = header[3]; 922aabbc4fbSShri Abhyankar 923aabbc4fbSShri Abhyankar /* set global size if not set already*/ 924aabbc4fbSShri Abhyankar if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) { 925aabbc4fbSShri Abhyankar ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr); 926aabbc4fbSShri Abhyankar } else { 927aabbc4fbSShri Abhyankar /* if sizes and type are already set, check if the vector global sizes are correct */ 928aabbc4fbSShri Abhyankar ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr); 929aabbc4fbSShri 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); 930aabbc4fbSShri Abhyankar } 931e6324fbbSBarry Smith a = (Mat_SeqDense*)newmat->data; 932e6324fbbSBarry Smith if (!a->user_alloc) { 9330298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 934e6324fbbSBarry Smith } 935aabbc4fbSShri Abhyankar 936aabbc4fbSShri Abhyankar if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 937aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 938aabbc4fbSShri Abhyankar v = a->v; 939aabbc4fbSShri Abhyankar /* Allocate some temp space to read in the values and then flip them 940aabbc4fbSShri Abhyankar from row major to column major */ 941854ce69bSBarry Smith ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr); 942aabbc4fbSShri Abhyankar /* read in nonzero values */ 943aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 944aabbc4fbSShri Abhyankar /* now flip the values and store them in the matrix*/ 945aabbc4fbSShri Abhyankar for (j=0; j<N; j++) { 946aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 947aabbc4fbSShri Abhyankar *v++ =w[i*N+j]; 948aabbc4fbSShri Abhyankar } 949aabbc4fbSShri Abhyankar } 950aabbc4fbSShri Abhyankar ierr = PetscFree(w);CHKERRQ(ierr); 951aabbc4fbSShri Abhyankar } else { 952aabbc4fbSShri Abhyankar /* read row lengths */ 953854ce69bSBarry Smith ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr); 954aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 955aabbc4fbSShri Abhyankar 956aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 957aabbc4fbSShri Abhyankar v = a->v; 958aabbc4fbSShri Abhyankar 959aabbc4fbSShri Abhyankar /* read column indices and nonzeros */ 960854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr); 961aabbc4fbSShri Abhyankar cols = scols; 962aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 963854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr); 964aabbc4fbSShri Abhyankar vals = svals; 965aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 966aabbc4fbSShri Abhyankar 967aabbc4fbSShri Abhyankar /* insert into matrix */ 968aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 969aabbc4fbSShri Abhyankar for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 970aabbc4fbSShri Abhyankar svals += rowlengths[i]; scols += rowlengths[i]; 971aabbc4fbSShri Abhyankar } 972aabbc4fbSShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 973aabbc4fbSShri Abhyankar ierr = PetscFree(cols);CHKERRQ(ierr); 974aabbc4fbSShri Abhyankar ierr = PetscFree(rowlengths);CHKERRQ(ierr); 975aabbc4fbSShri Abhyankar } 976aabbc4fbSShri Abhyankar ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 977aabbc4fbSShri Abhyankar ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 978aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 979aabbc4fbSShri Abhyankar } 980aabbc4fbSShri Abhyankar 981aabbc4fbSShri Abhyankar #undef __FUNCT__ 9824a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII" 9836849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 984289bc588SBarry Smith { 985932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 986dfbe8321SBarry Smith PetscErrorCode ierr; 98713f74950SBarry Smith PetscInt i,j; 9882dcb1b2aSMatthew Knepley const char *name; 98987828ca2SBarry Smith PetscScalar *v; 990f3ef73ceSBarry Smith PetscViewerFormat format; 9915f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 992ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 9935f481a85SSatish Balay #endif 994932b0c3eSLois Curfman McInnes 9953a40ed3dSBarry Smith PetscFunctionBegin; 996b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 997456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 9983a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 999fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 1000d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1001d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 100244cd7ae7SLois Curfman McInnes v = a->v + i; 100377431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 1004d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1005aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1006329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 100757622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 1008329f5518SBarry Smith } else if (PetscRealPart(*v)) { 100957622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr); 10106831982aSBarry Smith } 101180cd9d93SLois Curfman McInnes #else 10126831982aSBarry Smith if (*v) { 101357622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr); 10146831982aSBarry Smith } 101580cd9d93SLois Curfman McInnes #endif 10161b807ce4Svictorle v += a->lda; 101780cd9d93SLois Curfman McInnes } 1018b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 101980cd9d93SLois Curfman McInnes } 1020d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 10213a40ed3dSBarry Smith } else { 1022d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1023aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 102447989497SBarry Smith /* determine if matrix has all real values */ 102547989497SBarry Smith v = a->v; 1026d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 1027ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;} 102847989497SBarry Smith } 102947989497SBarry Smith #endif 1030fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 10313a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 1032d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1033d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1034fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 1035ffac6cdbSBarry Smith } 1036ffac6cdbSBarry Smith 1037d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1038932b0c3eSLois Curfman McInnes v = a->v + i; 1039d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1040aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 104147989497SBarry Smith if (allreal) { 1042c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr); 104347989497SBarry Smith } else { 1044c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 104547989497SBarry Smith } 1046289bc588SBarry Smith #else 1047c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr); 1048289bc588SBarry Smith #endif 10491b807ce4Svictorle v += a->lda; 1050289bc588SBarry Smith } 1051b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 1052289bc588SBarry Smith } 1053fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 1054b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 1055ffac6cdbSBarry Smith } 1056d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 1057da3a660dSBarry Smith } 1058b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 10593a40ed3dSBarry Smith PetscFunctionReturn(0); 1060289bc588SBarry Smith } 1061289bc588SBarry Smith 10624a2ae208SSatish Balay #undef __FUNCT__ 10634a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary" 10646849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 1065932b0c3eSLois Curfman McInnes { 1066932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 10676849ba73SBarry Smith PetscErrorCode ierr; 106813f74950SBarry Smith int fd; 1069d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 1070f4403165SShri Abhyankar PetscScalar *v,*anonz,*vals; 1071f4403165SShri Abhyankar PetscViewerFormat format; 1072932b0c3eSLois Curfman McInnes 10733a40ed3dSBarry Smith PetscFunctionBegin; 1074b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 107590ace30eSBarry Smith 1076f4403165SShri Abhyankar ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1077f4403165SShri Abhyankar if (format == PETSC_VIEWER_NATIVE) { 1078f4403165SShri Abhyankar /* store the matrix as a dense matrix */ 1079785e854fSJed Brown ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr); 10802205254eSKarl Rupp 1081f4403165SShri Abhyankar col_lens[0] = MAT_FILE_CLASSID; 1082f4403165SShri Abhyankar col_lens[1] = m; 1083f4403165SShri Abhyankar col_lens[2] = n; 1084f4403165SShri Abhyankar col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 10852205254eSKarl Rupp 1086f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1087f4403165SShri Abhyankar ierr = PetscFree(col_lens);CHKERRQ(ierr); 1088f4403165SShri Abhyankar 1089f4403165SShri Abhyankar /* write out matrix, by rows */ 1090854ce69bSBarry Smith ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr); 1091f4403165SShri Abhyankar v = a->v; 1092f4403165SShri Abhyankar for (j=0; j<n; j++) { 1093f4403165SShri Abhyankar for (i=0; i<m; i++) { 1094f4403165SShri Abhyankar vals[j + i*n] = *v++; 1095f4403165SShri Abhyankar } 1096f4403165SShri Abhyankar } 1097f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1098f4403165SShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1099f4403165SShri Abhyankar } else { 1100854ce69bSBarry Smith ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr); 11012205254eSKarl Rupp 11020700a824SBarry Smith col_lens[0] = MAT_FILE_CLASSID; 1103932b0c3eSLois Curfman McInnes col_lens[1] = m; 1104932b0c3eSLois Curfman McInnes col_lens[2] = n; 1105932b0c3eSLois Curfman McInnes col_lens[3] = nz; 1106932b0c3eSLois Curfman McInnes 1107932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 1108932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 11096f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1110932b0c3eSLois Curfman McInnes 1111932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 1112932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 1113932b0c3eSLois Curfman McInnes ict = 0; 1114932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1115932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 1116932b0c3eSLois Curfman McInnes } 11176f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 1118606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 1119932b0c3eSLois Curfman McInnes 1120932b0c3eSLois Curfman McInnes /* store nonzero values */ 1121854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr); 1122932b0c3eSLois Curfman McInnes ict = 0; 1123932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1124932b0c3eSLois Curfman McInnes v = a->v + i; 1125932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 11261b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 1127932b0c3eSLois Curfman McInnes } 1128932b0c3eSLois Curfman McInnes } 11296f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1130606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 1131f4403165SShri Abhyankar } 11323a40ed3dSBarry Smith PetscFunctionReturn(0); 1133932b0c3eSLois Curfman McInnes } 1134932b0c3eSLois Curfman McInnes 11359804daf3SBarry Smith #include <petscdraw.h> 11364a2ae208SSatish Balay #undef __FUNCT__ 11374a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom" 1138*e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1139f1af5d2fSBarry Smith { 1140f1af5d2fSBarry Smith Mat A = (Mat) Aa; 1141f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 11426849ba73SBarry Smith PetscErrorCode ierr; 1143d0f46423SBarry Smith PetscInt m = A->rmap->n,n = A->cmap->n,color,i,j; 114487828ca2SBarry Smith PetscScalar *v = a->v; 1145b0a32e0cSBarry Smith PetscViewer viewer; 1146b05fc000SLisandro Dalcin PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r; 1147f3ef73ceSBarry Smith PetscViewerFormat format; 1148f1af5d2fSBarry Smith 1149f1af5d2fSBarry Smith PetscFunctionBegin; 1150f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1151b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1152b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1153f1af5d2fSBarry Smith 1154f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1155fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1156f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1157b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1158f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1159f1af5d2fSBarry Smith x_l = j; 1160f1af5d2fSBarry Smith x_r = x_l + 1.0; 1161f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1162f1af5d2fSBarry Smith y_l = m - i - 1.0; 1163f1af5d2fSBarry Smith y_r = y_l + 1.0; 1164329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1165b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1166329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1167b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1168f1af5d2fSBarry Smith } else { 1169f1af5d2fSBarry Smith continue; 1170f1af5d2fSBarry Smith } 1171b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1172f1af5d2fSBarry Smith } 1173f1af5d2fSBarry Smith } 1174f1af5d2fSBarry Smith } else { 1175f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1176f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1177b05fc000SLisandro Dalcin PetscReal minv = 0.0, maxv = 0.0; 1178b05fc000SLisandro Dalcin PetscDraw popup; 1179b05fc000SLisandro Dalcin 1180f1af5d2fSBarry Smith for (i = 0; i < m*n; i++) { 1181f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1182f1af5d2fSBarry Smith } 1183b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 1184b05fc000SLisandro Dalcin if (popup) {ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr);} 1185f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1186f1af5d2fSBarry Smith x_l = j; 1187f1af5d2fSBarry Smith x_r = x_l + 1.0; 1188f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1189f1af5d2fSBarry Smith y_l = m - i - 1.0; 1190f1af5d2fSBarry Smith y_r = y_l + 1.0; 1191b05fc000SLisandro Dalcin color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv); 1192b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1193f1af5d2fSBarry Smith } 1194f1af5d2fSBarry Smith } 1195f1af5d2fSBarry Smith } 1196f1af5d2fSBarry Smith PetscFunctionReturn(0); 1197f1af5d2fSBarry Smith } 1198f1af5d2fSBarry Smith 11994a2ae208SSatish Balay #undef __FUNCT__ 12004a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 1201*e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1202f1af5d2fSBarry Smith { 1203b0a32e0cSBarry Smith PetscDraw draw; 1204ace3abfcSBarry Smith PetscBool isnull; 1205329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1206dfbe8321SBarry Smith PetscErrorCode ierr; 1207f1af5d2fSBarry Smith 1208f1af5d2fSBarry Smith PetscFunctionBegin; 1209b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1210b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1211abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1212f1af5d2fSBarry Smith 1213f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1214d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1215f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1216b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1217b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 12180298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1219f1af5d2fSBarry Smith PetscFunctionReturn(0); 1220f1af5d2fSBarry Smith } 1221f1af5d2fSBarry Smith 12224a2ae208SSatish Balay #undef __FUNCT__ 12234a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 1224dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1225932b0c3eSLois Curfman McInnes { 1226dfbe8321SBarry Smith PetscErrorCode ierr; 1227ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1228932b0c3eSLois Curfman McInnes 12293a40ed3dSBarry Smith PetscFunctionBegin; 1230251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1231251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1232251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 12330f5bd95cSBarry Smith 1234c45a1595SBarry Smith if (iascii) { 1235c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 12360f5bd95cSBarry Smith } else if (isbinary) { 12373a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1238f1af5d2fSBarry Smith } else if (isdraw) { 1239f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1240932b0c3eSLois Curfman McInnes } 12413a40ed3dSBarry Smith PetscFunctionReturn(0); 1242932b0c3eSLois Curfman McInnes } 1243289bc588SBarry Smith 12444a2ae208SSatish Balay #undef __FUNCT__ 12454a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1246*e0877f53SBarry Smith static PetscErrorCode MatDestroy_SeqDense(Mat mat) 1247289bc588SBarry Smith { 1248ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1249dfbe8321SBarry Smith PetscErrorCode ierr; 125090f02eecSBarry Smith 12513a40ed3dSBarry Smith PetscFunctionBegin; 1252aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1253d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1254a5a9c739SBarry Smith #endif 125505b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 1256abc3b08eSStefano Zampini ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr); 12576857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1258bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1259dbd8c25aSHong Zhang 1260dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1261bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 1262bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 12638baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 12648baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 12658baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 12668baccfbdSHong Zhang #endif 1267bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 1268bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1269bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1270bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1271abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12723bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12733bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12743bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12753a40ed3dSBarry Smith PetscFunctionReturn(0); 1276289bc588SBarry Smith } 1277289bc588SBarry Smith 12784a2ae208SSatish Balay #undef __FUNCT__ 12794a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1280*e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1281289bc588SBarry Smith { 1282c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 12836849ba73SBarry Smith PetscErrorCode ierr; 128413f74950SBarry Smith PetscInt k,j,m,n,M; 128587828ca2SBarry Smith PetscScalar *v,tmp; 128648b35521SBarry Smith 12873a40ed3dSBarry Smith PetscFunctionBegin; 1288d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 1289e9695a30SBarry Smith if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */ 1290e7e72b3dSBarry Smith if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1291e7e72b3dSBarry Smith else { 1292d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1293289bc588SBarry Smith for (k=0; k<j; k++) { 12941b807ce4Svictorle tmp = v[j + k*M]; 12951b807ce4Svictorle v[j + k*M] = v[k + j*M]; 12961b807ce4Svictorle v[k + j*M] = tmp; 1297289bc588SBarry Smith } 1298289bc588SBarry Smith } 1299d64ed03dSBarry Smith } 13003a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1301d3e5ee88SLois Curfman McInnes Mat tmat; 1302ec8511deSBarry Smith Mat_SeqDense *tmatd; 130387828ca2SBarry Smith PetscScalar *v2; 1304af36a384SStefano Zampini PetscInt M2; 1305ea709b57SSatish Balay 1306fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX) { 1307ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1308d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 13097adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 13100298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1311fc4dec0aSBarry Smith } else { 1312fc4dec0aSBarry Smith tmat = *matout; 1313fc4dec0aSBarry Smith } 1314ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 1315af36a384SStefano Zampini v = mat->v; v2 = tmatd->v; M2 = tmatd->lda; 1316d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 1317af36a384SStefano Zampini for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M]; 1318d3e5ee88SLois Curfman McInnes } 13196d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 13206d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1321d3e5ee88SLois Curfman McInnes *matout = tmat; 132248b35521SBarry Smith } 13233a40ed3dSBarry Smith PetscFunctionReturn(0); 1324289bc588SBarry Smith } 1325289bc588SBarry Smith 13264a2ae208SSatish Balay #undef __FUNCT__ 13274a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1328*e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1329289bc588SBarry Smith { 1330c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1331c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 133213f74950SBarry Smith PetscInt i,j; 1333a2ea699eSBarry Smith PetscScalar *v1,*v2; 13349ea5d5aeSSatish Balay 13353a40ed3dSBarry Smith PetscFunctionBegin; 1336d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1337d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1338d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 13391b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1340d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 13413a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 13421b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 13431b807ce4Svictorle } 1344289bc588SBarry Smith } 134577c4ece6SBarry Smith *flg = PETSC_TRUE; 13463a40ed3dSBarry Smith PetscFunctionReturn(0); 1347289bc588SBarry Smith } 1348289bc588SBarry Smith 13494a2ae208SSatish Balay #undef __FUNCT__ 13504a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1351*e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1352289bc588SBarry Smith { 1353c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1354dfbe8321SBarry Smith PetscErrorCode ierr; 135513f74950SBarry Smith PetscInt i,n,len; 135687828ca2SBarry Smith PetscScalar *x,zero = 0.0; 135744cd7ae7SLois Curfman McInnes 13583a40ed3dSBarry Smith PetscFunctionBegin; 13592dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 13607a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 13611ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1362d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1363e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 136444cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 13651b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1366289bc588SBarry Smith } 13671ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 13683a40ed3dSBarry Smith PetscFunctionReturn(0); 1369289bc588SBarry Smith } 1370289bc588SBarry Smith 13714a2ae208SSatish Balay #undef __FUNCT__ 13724a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1373*e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1374289bc588SBarry Smith { 1375c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1376f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1377f1ceaac6SMatthew G. Knepley PetscScalar x,*v; 1378dfbe8321SBarry Smith PetscErrorCode ierr; 1379d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 138055659b69SBarry Smith 13813a40ed3dSBarry Smith PetscFunctionBegin; 138228988994SBarry Smith if (ll) { 13837a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 1384f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr); 1385e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1386da3a660dSBarry Smith for (i=0; i<m; i++) { 1387da3a660dSBarry Smith x = l[i]; 1388da3a660dSBarry Smith v = mat->v + i; 1389b43bac26SStefano Zampini for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;} 1390da3a660dSBarry Smith } 1391f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr); 1392eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1393da3a660dSBarry Smith } 139428988994SBarry Smith if (rr) { 13957a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 1396f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr); 1397e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1398da3a660dSBarry Smith for (i=0; i<n; i++) { 1399da3a660dSBarry Smith x = r[i]; 1400b43bac26SStefano Zampini v = mat->v + i*mat->lda; 14012205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1402da3a660dSBarry Smith } 1403f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr); 1404eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1405da3a660dSBarry Smith } 14063a40ed3dSBarry Smith PetscFunctionReturn(0); 1407289bc588SBarry Smith } 1408289bc588SBarry Smith 14094a2ae208SSatish Balay #undef __FUNCT__ 14104a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1411*e0877f53SBarry Smith static PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1412289bc588SBarry Smith { 1413c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 141487828ca2SBarry Smith PetscScalar *v = mat->v; 1415329f5518SBarry Smith PetscReal sum = 0.0; 1416d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1417efee365bSSatish Balay PetscErrorCode ierr; 141855659b69SBarry Smith 14193a40ed3dSBarry Smith PetscFunctionBegin; 1420289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1421a5ce6ee0Svictorle if (lda>m) { 1422d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1423a5ce6ee0Svictorle v = mat->v+j*lda; 1424a5ce6ee0Svictorle for (i=0; i<m; i++) { 1425a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1426a5ce6ee0Svictorle } 1427a5ce6ee0Svictorle } 1428a5ce6ee0Svictorle } else { 1429d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1430329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1431289bc588SBarry Smith } 1432a5ce6ee0Svictorle } 14338f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1434dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 14353a40ed3dSBarry Smith } else if (type == NORM_1) { 1436064f8208SBarry Smith *nrm = 0.0; 1437d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 14381b807ce4Svictorle v = mat->v + j*mat->lda; 1439289bc588SBarry Smith sum = 0.0; 1440d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 144133a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1442289bc588SBarry Smith } 1443064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1444289bc588SBarry Smith } 1445eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 14463a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1447064f8208SBarry Smith *nrm = 0.0; 1448d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1449289bc588SBarry Smith v = mat->v + j; 1450289bc588SBarry Smith sum = 0.0; 1451d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 14521b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1453289bc588SBarry Smith } 1454064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1455289bc588SBarry Smith } 1456eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1457e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 14583a40ed3dSBarry Smith PetscFunctionReturn(0); 1459289bc588SBarry Smith } 1460289bc588SBarry Smith 14614a2ae208SSatish Balay #undef __FUNCT__ 14624a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1463*e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1464289bc588SBarry Smith { 1465c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 146663ba0a88SBarry Smith PetscErrorCode ierr; 146767e560aaSBarry Smith 14683a40ed3dSBarry Smith PetscFunctionBegin; 1469b5a2b587SKris Buschelman switch (op) { 1470b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 14714e0d8c25SBarry Smith aij->roworiented = flg; 1472b5a2b587SKris Buschelman break; 1473512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1474b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 14753971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 14764e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 147713fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1478b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1479b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 14805021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 14815021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 14825021d80fSJed Brown break; 14835021d80fSJed Brown case MAT_SPD: 148477e54ba9SKris Buschelman case MAT_SYMMETRIC: 148577e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 14869a4540c5SBarry Smith case MAT_HERMITIAN: 14879a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 14885021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 148977e54ba9SKris Buschelman break; 1490b5a2b587SKris Buschelman default: 1491e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 14923a40ed3dSBarry Smith } 14933a40ed3dSBarry Smith PetscFunctionReturn(0); 1494289bc588SBarry Smith } 1495289bc588SBarry Smith 14964a2ae208SSatish Balay #undef __FUNCT__ 14974a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1498*e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A) 14996f0a148fSBarry Smith { 1500ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 15016849ba73SBarry Smith PetscErrorCode ierr; 1502d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 15033a40ed3dSBarry Smith 15043a40ed3dSBarry Smith PetscFunctionBegin; 1505a5ce6ee0Svictorle if (lda>m) { 1506d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1507a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1508a5ce6ee0Svictorle } 1509a5ce6ee0Svictorle } else { 1510d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1511a5ce6ee0Svictorle } 15123a40ed3dSBarry Smith PetscFunctionReturn(0); 15136f0a148fSBarry Smith } 15146f0a148fSBarry Smith 15154a2ae208SSatish Balay #undef __FUNCT__ 15164a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 1517*e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 15186f0a148fSBarry Smith { 151997b48c8fSBarry Smith PetscErrorCode ierr; 1520ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1521b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 152297b48c8fSBarry Smith PetscScalar *slot,*bb; 152397b48c8fSBarry Smith const PetscScalar *xx; 152455659b69SBarry Smith 15253a40ed3dSBarry Smith PetscFunctionBegin; 1526b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1527b9679d65SBarry Smith for (i=0; i<N; i++) { 1528b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1529b9679d65SBarry 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); 1530b9679d65SBarry Smith } 1531b9679d65SBarry Smith #endif 1532b9679d65SBarry Smith 153397b48c8fSBarry Smith /* fix right hand side if needed */ 153497b48c8fSBarry Smith if (x && b) { 153597b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 153697b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 15372205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 153897b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 153997b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 154097b48c8fSBarry Smith } 154197b48c8fSBarry Smith 15426f0a148fSBarry Smith for (i=0; i<N; i++) { 15436f0a148fSBarry Smith slot = l->v + rows[i]; 1544b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 15456f0a148fSBarry Smith } 1546f4df32b1SMatthew Knepley if (diag != 0.0) { 1547b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 15486f0a148fSBarry Smith for (i=0; i<N; i++) { 1549b9679d65SBarry Smith slot = l->v + (m+1)*rows[i]; 1550f4df32b1SMatthew Knepley *slot = diag; 15516f0a148fSBarry Smith } 15526f0a148fSBarry Smith } 15533a40ed3dSBarry Smith PetscFunctionReturn(0); 15546f0a148fSBarry Smith } 1555557bce09SLois Curfman McInnes 15564a2ae208SSatish Balay #undef __FUNCT__ 15578c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense" 1558*e0877f53SBarry Smith static PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[]) 155964e87e97SBarry Smith { 1560c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 15613a40ed3dSBarry Smith 15623a40ed3dSBarry Smith PetscFunctionBegin; 1563e32f2f54SBarry 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"); 156464e87e97SBarry Smith *array = mat->v; 15653a40ed3dSBarry Smith PetscFunctionReturn(0); 156664e87e97SBarry Smith } 15670754003eSLois Curfman McInnes 15684a2ae208SSatish Balay #undef __FUNCT__ 15698c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense" 1570*e0877f53SBarry Smith static PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1571ff14e315SSatish Balay { 15723a40ed3dSBarry Smith PetscFunctionBegin; 157309b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 15743a40ed3dSBarry Smith PetscFunctionReturn(0); 1575ff14e315SSatish Balay } 15760754003eSLois Curfman McInnes 15774a2ae208SSatish Balay #undef __FUNCT__ 15788c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray" 1579dec5eb66SMatthew G Knepley /*@C 15808c778c55SBarry Smith MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored 158173a71a0fSBarry Smith 158273a71a0fSBarry Smith Not Collective 158373a71a0fSBarry Smith 158473a71a0fSBarry Smith Input Parameter: 1585579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 158673a71a0fSBarry Smith 158773a71a0fSBarry Smith Output Parameter: 158873a71a0fSBarry Smith . array - pointer to the data 158973a71a0fSBarry Smith 159073a71a0fSBarry Smith Level: intermediate 159173a71a0fSBarry Smith 15928c778c55SBarry Smith .seealso: MatDenseRestoreArray() 159373a71a0fSBarry Smith @*/ 15948c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 159573a71a0fSBarry Smith { 159673a71a0fSBarry Smith PetscErrorCode ierr; 159773a71a0fSBarry Smith 159873a71a0fSBarry Smith PetscFunctionBegin; 15998c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 160073a71a0fSBarry Smith PetscFunctionReturn(0); 160173a71a0fSBarry Smith } 160273a71a0fSBarry Smith 160373a71a0fSBarry Smith #undef __FUNCT__ 16048c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray" 1605dec5eb66SMatthew G Knepley /*@C 1606579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 160773a71a0fSBarry Smith 160873a71a0fSBarry Smith Not Collective 160973a71a0fSBarry Smith 161073a71a0fSBarry Smith Input Parameters: 1611579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 161273a71a0fSBarry Smith . array - pointer to the data 161373a71a0fSBarry Smith 161473a71a0fSBarry Smith Level: intermediate 161573a71a0fSBarry Smith 16168c778c55SBarry Smith .seealso: MatDenseGetArray() 161773a71a0fSBarry Smith @*/ 16188c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 161973a71a0fSBarry Smith { 162073a71a0fSBarry Smith PetscErrorCode ierr; 162173a71a0fSBarry Smith 162273a71a0fSBarry Smith PetscFunctionBegin; 16238c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 162473a71a0fSBarry Smith PetscFunctionReturn(0); 162573a71a0fSBarry Smith } 162673a71a0fSBarry Smith 162773a71a0fSBarry Smith #undef __FUNCT__ 16284a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 162913f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 16300754003eSLois Curfman McInnes { 1631c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 16326849ba73SBarry Smith PetscErrorCode ierr; 16335d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 16345d0c19d7SBarry Smith const PetscInt *irow,*icol; 163587828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 16360754003eSLois Curfman McInnes Mat newmat; 16370754003eSLois Curfman McInnes 16383a40ed3dSBarry Smith PetscFunctionBegin; 163978b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 164078b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1641e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1642e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 16430754003eSLois Curfman McInnes 1644182d2002SSatish Balay /* Check submatrixcall */ 1645182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 164613f74950SBarry Smith PetscInt n_cols,n_rows; 1647182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 164821a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1649f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1650c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 165121a2c019SBarry Smith } 1652182d2002SSatish Balay newmat = *B; 1653182d2002SSatish Balay } else { 16540754003eSLois Curfman McInnes /* Create and fill new matrix */ 1655ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 1656f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 16577adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 16580298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1659182d2002SSatish Balay } 1660182d2002SSatish Balay 1661182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1662182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1663182d2002SSatish Balay 1664182d2002SSatish Balay for (i=0; i<ncols; i++) { 16656de62eeeSBarry Smith av = v + mat->lda*icol[i]; 16662205254eSKarl Rupp for (j=0; j<nrows; j++) *bv++ = av[irow[j]]; 16670754003eSLois Curfman McInnes } 1668182d2002SSatish Balay 1669182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 16706d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 16716d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 16720754003eSLois Curfman McInnes 16730754003eSLois Curfman McInnes /* Free work space */ 167478b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 167578b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1676182d2002SSatish Balay *B = newmat; 16773a40ed3dSBarry Smith PetscFunctionReturn(0); 16780754003eSLois Curfman McInnes } 16790754003eSLois Curfman McInnes 16804a2ae208SSatish Balay #undef __FUNCT__ 16814a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 1682*e0877f53SBarry Smith static PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1683905e6a2fSBarry Smith { 16846849ba73SBarry Smith PetscErrorCode ierr; 168513f74950SBarry Smith PetscInt i; 1686905e6a2fSBarry Smith 16873a40ed3dSBarry Smith PetscFunctionBegin; 1688905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1689854ce69bSBarry Smith ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr); 1690905e6a2fSBarry Smith } 1691905e6a2fSBarry Smith 1692905e6a2fSBarry Smith for (i=0; i<n; i++) { 16936a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1694905e6a2fSBarry Smith } 16953a40ed3dSBarry Smith PetscFunctionReturn(0); 1696905e6a2fSBarry Smith } 1697905e6a2fSBarry Smith 16984a2ae208SSatish Balay #undef __FUNCT__ 1699c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1700*e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1701c0aa2d19SHong Zhang { 1702c0aa2d19SHong Zhang PetscFunctionBegin; 1703c0aa2d19SHong Zhang PetscFunctionReturn(0); 1704c0aa2d19SHong Zhang } 1705c0aa2d19SHong Zhang 1706c0aa2d19SHong Zhang #undef __FUNCT__ 1707c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1708*e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1709c0aa2d19SHong Zhang { 1710c0aa2d19SHong Zhang PetscFunctionBegin; 1711c0aa2d19SHong Zhang PetscFunctionReturn(0); 1712c0aa2d19SHong Zhang } 1713c0aa2d19SHong Zhang 1714c0aa2d19SHong Zhang #undef __FUNCT__ 17154a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1716*e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 17174b0e389bSBarry Smith { 17184b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 17196849ba73SBarry Smith PetscErrorCode ierr; 1720d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 17213a40ed3dSBarry Smith 17223a40ed3dSBarry Smith PetscFunctionBegin; 172333f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 172433f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1725cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 17263a40ed3dSBarry Smith PetscFunctionReturn(0); 17273a40ed3dSBarry Smith } 1728e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1729a5ce6ee0Svictorle if (lda1>m || lda2>m) { 17300dbb7854Svictorle for (j=0; j<n; j++) { 1731a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1732a5ce6ee0Svictorle } 1733a5ce6ee0Svictorle } else { 1734d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1735a5ce6ee0Svictorle } 1736273d9f13SBarry Smith PetscFunctionReturn(0); 1737273d9f13SBarry Smith } 1738273d9f13SBarry Smith 17394a2ae208SSatish Balay #undef __FUNCT__ 17404994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense" 1741*e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A) 1742273d9f13SBarry Smith { 1743dfbe8321SBarry Smith PetscErrorCode ierr; 1744273d9f13SBarry Smith 1745273d9f13SBarry Smith PetscFunctionBegin; 1746273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 17473a40ed3dSBarry Smith PetscFunctionReturn(0); 17484b0e389bSBarry Smith } 17494b0e389bSBarry Smith 1750284134d9SBarry Smith #undef __FUNCT__ 1751ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense" 1752ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1753ba337c44SJed Brown { 1754ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1755ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1756ba337c44SJed Brown PetscScalar *aa = a->v; 1757ba337c44SJed Brown 1758ba337c44SJed Brown PetscFunctionBegin; 1759ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1760ba337c44SJed Brown PetscFunctionReturn(0); 1761ba337c44SJed Brown } 1762ba337c44SJed Brown 1763ba337c44SJed Brown #undef __FUNCT__ 1764ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense" 1765ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1766ba337c44SJed Brown { 1767ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1768ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1769ba337c44SJed Brown PetscScalar *aa = a->v; 1770ba337c44SJed Brown 1771ba337c44SJed Brown PetscFunctionBegin; 1772ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1773ba337c44SJed Brown PetscFunctionReturn(0); 1774ba337c44SJed Brown } 1775ba337c44SJed Brown 1776ba337c44SJed Brown #undef __FUNCT__ 1777ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense" 1778ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 1779ba337c44SJed Brown { 1780ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1781ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1782ba337c44SJed Brown PetscScalar *aa = a->v; 1783ba337c44SJed Brown 1784ba337c44SJed Brown PetscFunctionBegin; 1785ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 1786ba337c44SJed Brown PetscFunctionReturn(0); 1787ba337c44SJed Brown } 1788284134d9SBarry Smith 1789a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1790a9fe9ddaSSatish Balay #undef __FUNCT__ 1791a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1792a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1793a9fe9ddaSSatish Balay { 1794a9fe9ddaSSatish Balay PetscErrorCode ierr; 1795a9fe9ddaSSatish Balay 1796a9fe9ddaSSatish Balay PetscFunctionBegin; 1797a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 17983ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1799a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 18003ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1801a9fe9ddaSSatish Balay } 18023ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1803a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 18043ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1805a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1806a9fe9ddaSSatish Balay } 1807a9fe9ddaSSatish Balay 1808a9fe9ddaSSatish Balay #undef __FUNCT__ 1809a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1810a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1811a9fe9ddaSSatish Balay { 1812ee16a9a1SHong Zhang PetscErrorCode ierr; 1813d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1814ee16a9a1SHong Zhang Mat Cmat; 1815a9fe9ddaSSatish Balay 1816ee16a9a1SHong Zhang PetscFunctionBegin; 1817e32f2f54SBarry 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); 1818ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1819ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1820ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 18210298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 1822d73949e8SHong Zhang 1823ee16a9a1SHong Zhang *C = Cmat; 1824ee16a9a1SHong Zhang PetscFunctionReturn(0); 1825ee16a9a1SHong Zhang } 1826a9fe9ddaSSatish Balay 182798a3b096SSatish Balay #undef __FUNCT__ 1828a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1829a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1830a9fe9ddaSSatish Balay { 1831a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1832a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1833a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 18340805154bSBarry Smith PetscBLASInt m,n,k; 1835a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1836c5df96a5SBarry Smith PetscErrorCode ierr; 1837fd4e9aacSBarry Smith PetscBool flg; 1838a9fe9ddaSSatish Balay 1839a9fe9ddaSSatish Balay PetscFunctionBegin; 1840fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr); 1841fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense"); 1842fd4e9aacSBarry Smith 1843fd4e9aacSBarry Smith /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/ 1844fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr); 1845fd4e9aacSBarry Smith if (flg) { 1846fd4e9aacSBarry Smith C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense; 1847fd4e9aacSBarry Smith ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr); 1848fd4e9aacSBarry Smith PetscFunctionReturn(0); 1849fd4e9aacSBarry Smith } 1850fd4e9aacSBarry Smith 1851fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr); 1852fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense"); 1853c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1854c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1855c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 18565ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1857a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1858a9fe9ddaSSatish Balay } 1859a9fe9ddaSSatish Balay 1860a9fe9ddaSSatish Balay #undef __FUNCT__ 186175648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense" 186275648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1863a9fe9ddaSSatish Balay { 1864a9fe9ddaSSatish Balay PetscErrorCode ierr; 1865a9fe9ddaSSatish Balay 1866a9fe9ddaSSatish Balay PetscFunctionBegin; 1867a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 18683ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 186975648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 18703ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1871a9fe9ddaSSatish Balay } 18723ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 187375648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 18743ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1875a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1876a9fe9ddaSSatish Balay } 1877a9fe9ddaSSatish Balay 1878a9fe9ddaSSatish Balay #undef __FUNCT__ 187975648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense" 188075648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1881a9fe9ddaSSatish Balay { 1882ee16a9a1SHong Zhang PetscErrorCode ierr; 1883d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1884ee16a9a1SHong Zhang Mat Cmat; 1885a9fe9ddaSSatish Balay 1886ee16a9a1SHong Zhang PetscFunctionBegin; 1887e32f2f54SBarry 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); 1888ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1889ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1890ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 18910298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 18922205254eSKarl Rupp 1893ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 18942205254eSKarl Rupp 1895ee16a9a1SHong Zhang *C = Cmat; 1896ee16a9a1SHong Zhang PetscFunctionReturn(0); 1897ee16a9a1SHong Zhang } 1898a9fe9ddaSSatish Balay 1899a9fe9ddaSSatish Balay #undef __FUNCT__ 190075648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense" 190175648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1902a9fe9ddaSSatish Balay { 1903a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1904a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1905a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 19060805154bSBarry Smith PetscBLASInt m,n,k; 1907a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1908c5df96a5SBarry Smith PetscErrorCode ierr; 1909a9fe9ddaSSatish Balay 1910a9fe9ddaSSatish Balay PetscFunctionBegin; 1911c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr); 1912c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1913c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 19142fbe02b9SBarry Smith /* 19152fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 19162fbe02b9SBarry Smith */ 19175ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1918a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1919a9fe9ddaSSatish Balay } 1920985db425SBarry Smith 1921985db425SBarry Smith #undef __FUNCT__ 1922985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 1923*e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1924985db425SBarry Smith { 1925985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1926985db425SBarry Smith PetscErrorCode ierr; 1927d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1928985db425SBarry Smith PetscScalar *x; 1929985db425SBarry Smith MatScalar *aa = a->v; 1930985db425SBarry Smith 1931985db425SBarry Smith PetscFunctionBegin; 1932e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1933985db425SBarry Smith 1934985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1935985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1936985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1937e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1938985db425SBarry Smith for (i=0; i<m; i++) { 1939985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1940985db425SBarry Smith for (j=1; j<n; j++) { 1941985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1942985db425SBarry Smith } 1943985db425SBarry Smith } 1944985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1945985db425SBarry Smith PetscFunctionReturn(0); 1946985db425SBarry Smith } 1947985db425SBarry Smith 1948985db425SBarry Smith #undef __FUNCT__ 1949985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 1950*e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 1951985db425SBarry Smith { 1952985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1953985db425SBarry Smith PetscErrorCode ierr; 1954d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1955985db425SBarry Smith PetscScalar *x; 1956985db425SBarry Smith PetscReal atmp; 1957985db425SBarry Smith MatScalar *aa = a->v; 1958985db425SBarry Smith 1959985db425SBarry Smith PetscFunctionBegin; 1960e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1961985db425SBarry Smith 1962985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1963985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1964985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1965e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1966985db425SBarry Smith for (i=0; i<m; i++) { 19679189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 1968985db425SBarry Smith for (j=1; j<n; j++) { 1969985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 1970985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 1971985db425SBarry Smith } 1972985db425SBarry Smith } 1973985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1974985db425SBarry Smith PetscFunctionReturn(0); 1975985db425SBarry Smith } 1976985db425SBarry Smith 1977985db425SBarry Smith #undef __FUNCT__ 1978985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 1979*e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 1980985db425SBarry Smith { 1981985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1982985db425SBarry Smith PetscErrorCode ierr; 1983d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1984985db425SBarry Smith PetscScalar *x; 1985985db425SBarry Smith MatScalar *aa = a->v; 1986985db425SBarry Smith 1987985db425SBarry Smith PetscFunctionBegin; 1988e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1989985db425SBarry Smith 1990985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1991985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1992985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1993e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1994985db425SBarry Smith for (i=0; i<m; i++) { 1995985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1996985db425SBarry Smith for (j=1; j<n; j++) { 1997985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1998985db425SBarry Smith } 1999985db425SBarry Smith } 2000985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2001985db425SBarry Smith PetscFunctionReturn(0); 2002985db425SBarry Smith } 2003985db425SBarry Smith 20048d0534beSBarry Smith #undef __FUNCT__ 20058d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 2006*e0877f53SBarry Smith static PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 20078d0534beSBarry Smith { 20088d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 20098d0534beSBarry Smith PetscErrorCode ierr; 20108d0534beSBarry Smith PetscScalar *x; 20118d0534beSBarry Smith 20128d0534beSBarry Smith PetscFunctionBegin; 2013e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 20148d0534beSBarry Smith 20158d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2016d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 20178d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 20188d0534beSBarry Smith PetscFunctionReturn(0); 20198d0534beSBarry Smith } 20208d0534beSBarry Smith 20210716a85fSBarry Smith 20220716a85fSBarry Smith #undef __FUNCT__ 20230716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense" 20240716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 20250716a85fSBarry Smith { 20260716a85fSBarry Smith PetscErrorCode ierr; 20270716a85fSBarry Smith PetscInt i,j,m,n; 20280716a85fSBarry Smith PetscScalar *a; 20290716a85fSBarry Smith 20300716a85fSBarry Smith PetscFunctionBegin; 20310716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 20320716a85fSBarry Smith ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); 20338c778c55SBarry Smith ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr); 20340716a85fSBarry Smith if (type == NORM_2) { 20350716a85fSBarry Smith for (i=0; i<n; i++) { 20360716a85fSBarry Smith for (j=0; j<m; j++) { 20370716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 20380716a85fSBarry Smith } 20390716a85fSBarry Smith a += m; 20400716a85fSBarry Smith } 20410716a85fSBarry Smith } else if (type == NORM_1) { 20420716a85fSBarry Smith for (i=0; i<n; i++) { 20430716a85fSBarry Smith for (j=0; j<m; j++) { 20440716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 20450716a85fSBarry Smith } 20460716a85fSBarry Smith a += m; 20470716a85fSBarry Smith } 20480716a85fSBarry Smith } else if (type == NORM_INFINITY) { 20490716a85fSBarry Smith for (i=0; i<n; i++) { 20500716a85fSBarry Smith for (j=0; j<m; j++) { 20510716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 20520716a85fSBarry Smith } 20530716a85fSBarry Smith a += m; 20540716a85fSBarry Smith } 2055ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 20568c778c55SBarry Smith ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr); 20570716a85fSBarry Smith if (type == NORM_2) { 20588f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 20590716a85fSBarry Smith } 20600716a85fSBarry Smith PetscFunctionReturn(0); 20610716a85fSBarry Smith } 20620716a85fSBarry Smith 206373a71a0fSBarry Smith #undef __FUNCT__ 206473a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense" 206573a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 206673a71a0fSBarry Smith { 206773a71a0fSBarry Smith PetscErrorCode ierr; 206873a71a0fSBarry Smith PetscScalar *a; 206973a71a0fSBarry Smith PetscInt m,n,i; 207073a71a0fSBarry Smith 207173a71a0fSBarry Smith PetscFunctionBegin; 207273a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 20738c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 207473a71a0fSBarry Smith for (i=0; i<m*n; i++) { 207573a71a0fSBarry Smith ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr); 207673a71a0fSBarry Smith } 20778c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 207873a71a0fSBarry Smith PetscFunctionReturn(0); 207973a71a0fSBarry Smith } 208073a71a0fSBarry Smith 20813b49f96aSBarry Smith #undef __FUNCT__ 20823b49f96aSBarry Smith #define __FUNCT__ "MatMissingDiagonal_SeqDense" 20833b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool *missing,PetscInt *d) 20843b49f96aSBarry Smith { 20853b49f96aSBarry Smith PetscFunctionBegin; 20863b49f96aSBarry Smith *missing = PETSC_FALSE; 20873b49f96aSBarry Smith PetscFunctionReturn(0); 20883b49f96aSBarry Smith } 208973a71a0fSBarry Smith 2090abc3b08eSStefano Zampini 2091289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2092a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2093905e6a2fSBarry Smith MatGetRow_SeqDense, 2094905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2095905e6a2fSBarry Smith MatMult_SeqDense, 209697304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 20977c922b88SBarry Smith MatMultTranspose_SeqDense, 20987c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2099db4efbfdSBarry Smith 0, 2100db4efbfdSBarry Smith 0, 2101db4efbfdSBarry Smith 0, 2102db4efbfdSBarry Smith /* 10*/ 0, 2103905e6a2fSBarry Smith MatLUFactor_SeqDense, 2104905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 210541f059aeSBarry Smith MatSOR_SeqDense, 2106ec8511deSBarry Smith MatTranspose_SeqDense, 210797304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2108905e6a2fSBarry Smith MatEqual_SeqDense, 2109905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2110905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2111905e6a2fSBarry Smith MatNorm_SeqDense, 2112c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2113c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2114905e6a2fSBarry Smith MatSetOption_SeqDense, 2115905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2116d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2117db4efbfdSBarry Smith 0, 2118db4efbfdSBarry Smith 0, 2119db4efbfdSBarry Smith 0, 2120db4efbfdSBarry Smith 0, 21214994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2122273d9f13SBarry Smith 0, 2123905e6a2fSBarry Smith 0, 212473a71a0fSBarry Smith 0, 212573a71a0fSBarry Smith 0, 2126d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2127a5ae1ecdSBarry Smith 0, 2128a5ae1ecdSBarry Smith 0, 2129a5ae1ecdSBarry Smith 0, 2130a5ae1ecdSBarry Smith 0, 2131d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 2132a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 2133a5ae1ecdSBarry Smith 0, 21344b0e389bSBarry Smith MatGetValues_SeqDense, 2135a5ae1ecdSBarry Smith MatCopy_SeqDense, 2136d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2137a5ae1ecdSBarry Smith MatScale_SeqDense, 21387d68702bSBarry Smith MatShift_Basic, 2139a5ae1ecdSBarry Smith 0, 2140a5ae1ecdSBarry Smith 0, 214173a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2142a5ae1ecdSBarry Smith 0, 2143a5ae1ecdSBarry Smith 0, 2144a5ae1ecdSBarry Smith 0, 2145a5ae1ecdSBarry Smith 0, 2146d519adbfSMatthew Knepley /* 54*/ 0, 2147a5ae1ecdSBarry Smith 0, 2148a5ae1ecdSBarry Smith 0, 2149a5ae1ecdSBarry Smith 0, 2150a5ae1ecdSBarry Smith 0, 2151d519adbfSMatthew Knepley /* 59*/ 0, 2152e03a110bSBarry Smith MatDestroy_SeqDense, 2153e03a110bSBarry Smith MatView_SeqDense, 2154357abbc8SBarry Smith 0, 215597304618SKris Buschelman 0, 2156d519adbfSMatthew Knepley /* 64*/ 0, 215797304618SKris Buschelman 0, 215897304618SKris Buschelman 0, 215997304618SKris Buschelman 0, 216097304618SKris Buschelman 0, 2161d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 216297304618SKris Buschelman 0, 216397304618SKris Buschelman 0, 216497304618SKris Buschelman 0, 216597304618SKris Buschelman 0, 2166d519adbfSMatthew Knepley /* 74*/ 0, 216797304618SKris Buschelman 0, 216897304618SKris Buschelman 0, 216997304618SKris Buschelman 0, 217097304618SKris Buschelman 0, 2171d519adbfSMatthew Knepley /* 79*/ 0, 217297304618SKris Buschelman 0, 217397304618SKris Buschelman 0, 217497304618SKris Buschelman 0, 21755bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2176865e5f61SKris Buschelman 0, 21771cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2178865e5f61SKris Buschelman 0, 2179865e5f61SKris Buschelman 0, 2180865e5f61SKris Buschelman 0, 2181d519adbfSMatthew Knepley /* 89*/ MatMatMult_SeqDense_SeqDense, 2182a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 2183a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2184abc3b08eSStefano Zampini MatPtAP_SeqDense_SeqDense, 2185abc3b08eSStefano Zampini MatPtAPSymbolic_SeqDense_SeqDense, 2186abc3b08eSStefano Zampini /* 94*/ MatPtAPNumeric_SeqDense_SeqDense, 21875df89d91SHong Zhang 0, 21885df89d91SHong Zhang 0, 21895df89d91SHong Zhang 0, 2190284134d9SBarry Smith 0, 2191d519adbfSMatthew Knepley /* 99*/ 0, 2192284134d9SBarry Smith 0, 2193284134d9SBarry Smith 0, 2194ba337c44SJed Brown MatConjugate_SeqDense, 2195f73d5cc4SBarry Smith 0, 2196ba337c44SJed Brown /*104*/ 0, 2197ba337c44SJed Brown MatRealPart_SeqDense, 2198ba337c44SJed Brown MatImaginaryPart_SeqDense, 2199985db425SBarry Smith 0, 2200985db425SBarry Smith 0, 220185e2c93fSHong Zhang /*109*/ MatMatSolve_SeqDense, 2202985db425SBarry Smith 0, 22038d0534beSBarry Smith MatGetRowMin_SeqDense, 2204aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 22053b49f96aSBarry Smith MatMissingDiagonal_SeqDense, 2206aabbc4fbSShri Abhyankar /*114*/ 0, 2207aabbc4fbSShri Abhyankar 0, 2208aabbc4fbSShri Abhyankar 0, 2209aabbc4fbSShri Abhyankar 0, 2210aabbc4fbSShri Abhyankar 0, 2211aabbc4fbSShri Abhyankar /*119*/ 0, 2212aabbc4fbSShri Abhyankar 0, 2213aabbc4fbSShri Abhyankar 0, 22140716a85fSBarry Smith 0, 22150716a85fSBarry Smith 0, 22160716a85fSBarry Smith /*124*/ 0, 22175df89d91SHong Zhang MatGetColumnNorms_SeqDense, 22185df89d91SHong Zhang 0, 22195df89d91SHong Zhang 0, 22205df89d91SHong Zhang 0, 22215df89d91SHong Zhang /*129*/ 0, 222275648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 222375648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 222475648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 22253964eb88SJed Brown 0, 22263964eb88SJed Brown /*134*/ 0, 22273964eb88SJed Brown 0, 22283964eb88SJed Brown 0, 22293964eb88SJed Brown 0, 22303964eb88SJed Brown 0, 22313964eb88SJed Brown /*139*/ 0, 2232f9426fe0SMark Adams 0, 22333964eb88SJed Brown 0 2234985db425SBarry Smith }; 223590ace30eSBarry Smith 22364a2ae208SSatish Balay #undef __FUNCT__ 22374a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 22384b828684SBarry Smith /*@C 2239fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2240d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2241d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2242289bc588SBarry Smith 2243db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2244db81eaa0SLois Curfman McInnes 224520563c6bSBarry Smith Input Parameters: 2246db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 22470c775827SLois Curfman McInnes . m - number of rows 224818f449edSLois Curfman McInnes . n - number of columns 22490298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2250dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 225120563c6bSBarry Smith 225220563c6bSBarry Smith Output Parameter: 225344cd7ae7SLois Curfman McInnes . A - the matrix 225420563c6bSBarry Smith 2255b259b22eSLois Curfman McInnes Notes: 225618f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 225718f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 22580298fd71SBarry Smith set data=NULL. 225918f449edSLois Curfman McInnes 2260027ccd11SLois Curfman McInnes Level: intermediate 2261027ccd11SLois Curfman McInnes 2262dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 2263d65003e9SLois Curfman McInnes 226469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 226520563c6bSBarry Smith @*/ 22667087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2267289bc588SBarry Smith { 2268dfbe8321SBarry Smith PetscErrorCode ierr; 22693b2fbd54SBarry Smith 22703a40ed3dSBarry Smith PetscFunctionBegin; 2271f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2272f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2273273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2274273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2275273d9f13SBarry Smith PetscFunctionReturn(0); 2276273d9f13SBarry Smith } 2277273d9f13SBarry Smith 22784a2ae208SSatish Balay #undef __FUNCT__ 2279afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 2280273d9f13SBarry Smith /*@C 2281273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2282273d9f13SBarry Smith 2283273d9f13SBarry Smith Collective on MPI_Comm 2284273d9f13SBarry Smith 2285273d9f13SBarry Smith Input Parameters: 22861c4f3114SJed Brown + B - the matrix 22870298fd71SBarry Smith - data - the array (or NULL) 2288273d9f13SBarry Smith 2289273d9f13SBarry Smith Notes: 2290273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2291273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2292284134d9SBarry Smith need not call this routine. 2293273d9f13SBarry Smith 2294273d9f13SBarry Smith Level: intermediate 2295273d9f13SBarry Smith 2296273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2297273d9f13SBarry Smith 229869b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2299867c911aSBarry Smith 2300273d9f13SBarry Smith @*/ 23017087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2302273d9f13SBarry Smith { 23034ac538c5SBarry Smith PetscErrorCode ierr; 2304a23d5eceSKris Buschelman 2305a23d5eceSKris Buschelman PetscFunctionBegin; 23064ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2307a23d5eceSKris Buschelman PetscFunctionReturn(0); 2308a23d5eceSKris Buschelman } 2309a23d5eceSKris Buschelman 2310a23d5eceSKris Buschelman #undef __FUNCT__ 2311afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 23127087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2313a23d5eceSKris Buschelman { 2314273d9f13SBarry Smith Mat_SeqDense *b; 2315dfbe8321SBarry Smith PetscErrorCode ierr; 2316273d9f13SBarry Smith 2317273d9f13SBarry Smith PetscFunctionBegin; 2318273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2319a868139aSShri Abhyankar 232034ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 232134ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 232234ef9618SShri Abhyankar 2323273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 232486d161a7SShri Abhyankar b->Mmax = B->rmap->n; 232586d161a7SShri Abhyankar b->Nmax = B->cmap->n; 232686d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 232786d161a7SShri Abhyankar 23289e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 23299e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2330e92229d0SSatish Balay ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr); 23313bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 23322205254eSKarl Rupp 23339e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2334273d9f13SBarry Smith } else { /* user-allocated storage */ 23359e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2336273d9f13SBarry Smith b->v = data; 2337273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2338273d9f13SBarry Smith } 23390450473dSBarry Smith B->assembled = PETSC_TRUE; 2340273d9f13SBarry Smith PetscFunctionReturn(0); 2341273d9f13SBarry Smith } 2342273d9f13SBarry Smith 234365b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 23441b807ce4Svictorle #undef __FUNCT__ 23458baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental" 23468baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 23478baccfbdSHong Zhang { 2348d77f618aSHong Zhang Mat mat_elemental; 2349d77f618aSHong Zhang PetscErrorCode ierr; 2350d77f618aSHong Zhang PetscScalar *array,*v_colwise; 2351d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 2352d77f618aSHong Zhang 23538baccfbdSHong Zhang PetscFunctionBegin; 2354d77f618aSHong Zhang ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr); 2355d77f618aSHong Zhang ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr); 2356d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 2357d77f618aSHong Zhang k = 0; 2358d77f618aSHong Zhang for (j=0; j<N; j++) { 2359d77f618aSHong Zhang cols[j] = j; 2360d77f618aSHong Zhang for (i=0; i<M; i++) { 2361d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 2362d77f618aSHong Zhang } 2363d77f618aSHong Zhang } 2364d77f618aSHong Zhang for (i=0; i<M; i++) { 2365d77f618aSHong Zhang rows[i] = i; 2366d77f618aSHong Zhang } 2367d77f618aSHong Zhang ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr); 2368d77f618aSHong Zhang 2369d77f618aSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr); 2370d77f618aSHong Zhang ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 2371d77f618aSHong Zhang ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr); 2372d77f618aSHong Zhang ierr = MatSetUp(mat_elemental);CHKERRQ(ierr); 2373d77f618aSHong Zhang 2374d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 2375d77f618aSHong Zhang ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr); 2376d77f618aSHong Zhang ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2377d77f618aSHong Zhang ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2378d77f618aSHong Zhang ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr); 2379d77f618aSHong Zhang 2380511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 238128be2f97SBarry Smith ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr); 2382d77f618aSHong Zhang } else { 2383d77f618aSHong Zhang *newmat = mat_elemental; 2384d77f618aSHong Zhang } 23858baccfbdSHong Zhang PetscFunctionReturn(0); 23868baccfbdSHong Zhang } 238765b80a83SHong Zhang #endif 23888baccfbdSHong Zhang 23898baccfbdSHong Zhang #undef __FUNCT__ 23901b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 23911b807ce4Svictorle /*@C 23921b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 23931b807ce4Svictorle 23941b807ce4Svictorle Input parameter: 23951b807ce4Svictorle + A - the matrix 23961b807ce4Svictorle - lda - the leading dimension 23971b807ce4Svictorle 23981b807ce4Svictorle Notes: 2399867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 24001b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 24011b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 24021b807ce4Svictorle 24031b807ce4Svictorle Level: intermediate 24041b807ce4Svictorle 24051b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 24061b807ce4Svictorle 2407284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2408867c911aSBarry Smith 24091b807ce4Svictorle @*/ 24107087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 24111b807ce4Svictorle { 24121b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 241321a2c019SBarry Smith 24141b807ce4Svictorle PetscFunctionBegin; 2415e32f2f54SBarry 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); 24161b807ce4Svictorle b->lda = lda; 241721a2c019SBarry Smith b->changelda = PETSC_FALSE; 241821a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 24191b807ce4Svictorle PetscFunctionReturn(0); 24201b807ce4Svictorle } 24211b807ce4Svictorle 24220bad9183SKris Buschelman /*MC 2423fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 24240bad9183SKris Buschelman 24250bad9183SKris Buschelman Options Database Keys: 24260bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 24270bad9183SKris Buschelman 24280bad9183SKris Buschelman Level: beginner 24290bad9183SKris Buschelman 243089665df3SBarry Smith .seealso: MatCreateSeqDense() 243189665df3SBarry Smith 24320bad9183SKris Buschelman M*/ 24330bad9183SKris Buschelman 24344a2ae208SSatish Balay #undef __FUNCT__ 24354a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 24368cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B) 2437273d9f13SBarry Smith { 2438273d9f13SBarry Smith Mat_SeqDense *b; 2439dfbe8321SBarry Smith PetscErrorCode ierr; 24407c334f02SBarry Smith PetscMPIInt size; 2441273d9f13SBarry Smith 2442273d9f13SBarry Smith PetscFunctionBegin; 2443ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 2444e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 244555659b69SBarry Smith 2446b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 2447549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 244844cd7ae7SLois Curfman McInnes B->data = (void*)b; 244918f449edSLois Curfman McInnes 245044cd7ae7SLois Curfman McInnes b->pivots = 0; 2451273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2452273d9f13SBarry Smith b->v = 0; 245321a2c019SBarry Smith b->changelda = PETSC_FALSE; 24544e220ebcSLois Curfman McInnes 2455bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 2456bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2457bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 24588baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 24598baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 24608baccfbdSHong Zhang #endif 2461bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 2462bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2463bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2464bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2465abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 24663bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 24673bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 24683bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 246917667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 24703a40ed3dSBarry Smith PetscFunctionReturn(0); 2471289bc588SBarry Smith } 2472