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" 134f4df32b1SMatthew Knepley 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" 161dfbe8321SBarry Smith 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" 181f4df32b1SMatthew Knepley 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" 205ace3abfcSBarry Smith 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" 227719d5645SBarry Smith 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" 254dfbe8321SBarry Smith 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 2670481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*); 268719d5645SBarry Smith 2694a2ae208SSatish Balay #undef __FUNCT__ 2704a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense" 2710481f469SBarry Smith 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" 284dfbe8321SBarry Smith 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" 32085e2c93fSHong Zhang 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" 367dfbe8321SBarry Smith 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" 404dfbe8321SBarry Smith 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" 454dfbe8321SBarry Smith 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" 5070481f469SBarry Smith 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" 5440481f469SBarry Smith 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" 5900481f469SBarry Smith 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" 6010481f469SBarry Smith 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" 63241f059aeSBarry Smith 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" 674dfbe8321SBarry Smith 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" 698dfbe8321SBarry Smith 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" 721dfbe8321SBarry Smith 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" 745dfbe8321SBarry Smith 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" 77113f74950SBarry Smith 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" 79413f74950SBarry Smith 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" 80613f74950SBarry Smith 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" 87813f74950SBarry Smith 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" 901112444f4SShri Abhyankar 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" 1138dfbe8321SBarry Smith 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; 1143383922c3SLisandro Dalcin PetscInt m = A->rmap->n,n = A->cmap->n,i,j; 1144383922c3SLisandro Dalcin int color = PETSC_DRAW_WHITE; 114587828ca2SBarry Smith PetscScalar *v = a->v; 1146b0a32e0cSBarry Smith PetscViewer viewer; 1147b05fc000SLisandro Dalcin PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r; 1148f3ef73ceSBarry Smith PetscViewerFormat format; 1149f1af5d2fSBarry Smith 1150f1af5d2fSBarry Smith PetscFunctionBegin; 1151f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1152b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1153b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1154f1af5d2fSBarry Smith 1155f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1156383922c3SLisandro Dalcin 1157fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1158383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1159f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1160f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1161383922c3SLisandro Dalcin x_l = j; x_r = x_l + 1.0; 1162f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1163f1af5d2fSBarry Smith y_l = m - i - 1.0; 1164f1af5d2fSBarry Smith y_r = y_l + 1.0; 1165329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1166b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1167329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1168b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1169f1af5d2fSBarry Smith } else { 1170f1af5d2fSBarry Smith continue; 1171f1af5d2fSBarry Smith } 1172b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1173f1af5d2fSBarry Smith } 1174f1af5d2fSBarry Smith } 1175383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1176f1af5d2fSBarry Smith } else { 1177f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1178f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1179b05fc000SLisandro Dalcin PetscReal minv = 0.0, maxv = 0.0; 1180b05fc000SLisandro Dalcin PetscDraw popup; 1181b05fc000SLisandro Dalcin 1182f1af5d2fSBarry Smith for (i=0; i < m*n; i++) { 1183f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1184f1af5d2fSBarry Smith } 1185383922c3SLisandro Dalcin if (minv >= maxv) maxv = minv + PETSC_SMALL; 1186b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 1187b05fc000SLisandro Dalcin if (popup) {ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr);} 1188383922c3SLisandro Dalcin 1189383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1190f1af5d2fSBarry Smith for (j=0; j<n; j++) { 1191f1af5d2fSBarry Smith x_l = j; 1192f1af5d2fSBarry Smith x_r = x_l + 1.0; 1193f1af5d2fSBarry Smith for (i=0; i<m; i++) { 1194f1af5d2fSBarry Smith y_l = m - i - 1.0; 1195f1af5d2fSBarry Smith y_r = y_l + 1.0; 1196b05fc000SLisandro Dalcin color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv); 1197b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1198f1af5d2fSBarry Smith } 1199f1af5d2fSBarry Smith } 1200383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1201f1af5d2fSBarry Smith } 1202f1af5d2fSBarry Smith PetscFunctionReturn(0); 1203f1af5d2fSBarry Smith } 1204f1af5d2fSBarry Smith 12054a2ae208SSatish Balay #undef __FUNCT__ 12064a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 1207dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1208f1af5d2fSBarry Smith { 1209b0a32e0cSBarry Smith PetscDraw draw; 1210ace3abfcSBarry Smith PetscBool isnull; 1211329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1212dfbe8321SBarry Smith PetscErrorCode ierr; 1213f1af5d2fSBarry Smith 1214f1af5d2fSBarry Smith PetscFunctionBegin; 1215b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1216b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1217abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1218f1af5d2fSBarry Smith 1219d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1220f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1221b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1222*832b7cebSLisandro Dalcin ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1223b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 12240298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1225*832b7cebSLisandro Dalcin ierr = PetscDrawSave(draw);CHKERRQ(ierr); 1226f1af5d2fSBarry Smith PetscFunctionReturn(0); 1227f1af5d2fSBarry Smith } 1228f1af5d2fSBarry Smith 12294a2ae208SSatish Balay #undef __FUNCT__ 12304a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 1231dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1232932b0c3eSLois Curfman McInnes { 1233dfbe8321SBarry Smith PetscErrorCode ierr; 1234ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1235932b0c3eSLois Curfman McInnes 12363a40ed3dSBarry Smith PetscFunctionBegin; 1237251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1238251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1239251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 12400f5bd95cSBarry Smith 1241c45a1595SBarry Smith if (iascii) { 1242c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 12430f5bd95cSBarry Smith } else if (isbinary) { 12443a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1245f1af5d2fSBarry Smith } else if (isdraw) { 1246f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1247932b0c3eSLois Curfman McInnes } 12483a40ed3dSBarry Smith PetscFunctionReturn(0); 1249932b0c3eSLois Curfman McInnes } 1250289bc588SBarry Smith 12514a2ae208SSatish Balay #undef __FUNCT__ 12524a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1253dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat) 1254289bc588SBarry Smith { 1255ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1256dfbe8321SBarry Smith PetscErrorCode ierr; 125790f02eecSBarry Smith 12583a40ed3dSBarry Smith PetscFunctionBegin; 1259aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1260d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1261a5a9c739SBarry Smith #endif 126205b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 1263abc3b08eSStefano Zampini ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr); 12646857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1265bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1266dbd8c25aSHong Zhang 1267dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1268bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 1269bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 12708baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 12718baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 12728baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 12738baccfbdSHong Zhang #endif 1274bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 1275bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1276bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1277bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1278abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12793bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12803bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12813bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12823a40ed3dSBarry Smith PetscFunctionReturn(0); 1283289bc588SBarry Smith } 1284289bc588SBarry Smith 12854a2ae208SSatish Balay #undef __FUNCT__ 12864a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1287fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1288289bc588SBarry Smith { 1289c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 12906849ba73SBarry Smith PetscErrorCode ierr; 129113f74950SBarry Smith PetscInt k,j,m,n,M; 129287828ca2SBarry Smith PetscScalar *v,tmp; 129348b35521SBarry Smith 12943a40ed3dSBarry Smith PetscFunctionBegin; 1295d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 1296e9695a30SBarry Smith if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */ 1297e7e72b3dSBarry Smith if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1298e7e72b3dSBarry Smith else { 1299d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1300289bc588SBarry Smith for (k=0; k<j; k++) { 13011b807ce4Svictorle tmp = v[j + k*M]; 13021b807ce4Svictorle v[j + k*M] = v[k + j*M]; 13031b807ce4Svictorle v[k + j*M] = tmp; 1304289bc588SBarry Smith } 1305289bc588SBarry Smith } 1306d64ed03dSBarry Smith } 13073a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1308d3e5ee88SLois Curfman McInnes Mat tmat; 1309ec8511deSBarry Smith Mat_SeqDense *tmatd; 131087828ca2SBarry Smith PetscScalar *v2; 1311af36a384SStefano Zampini PetscInt M2; 1312ea709b57SSatish Balay 1313fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX) { 1314ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1315d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 13167adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 13170298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1318fc4dec0aSBarry Smith } else { 1319fc4dec0aSBarry Smith tmat = *matout; 1320fc4dec0aSBarry Smith } 1321ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 1322af36a384SStefano Zampini v = mat->v; v2 = tmatd->v; M2 = tmatd->lda; 1323d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 1324af36a384SStefano Zampini for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M]; 1325d3e5ee88SLois Curfman McInnes } 13266d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 13276d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1328d3e5ee88SLois Curfman McInnes *matout = tmat; 132948b35521SBarry Smith } 13303a40ed3dSBarry Smith PetscFunctionReturn(0); 1331289bc588SBarry Smith } 1332289bc588SBarry Smith 13334a2ae208SSatish Balay #undef __FUNCT__ 13344a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1335ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1336289bc588SBarry Smith { 1337c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1338c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 133913f74950SBarry Smith PetscInt i,j; 1340a2ea699eSBarry Smith PetscScalar *v1,*v2; 13419ea5d5aeSSatish Balay 13423a40ed3dSBarry Smith PetscFunctionBegin; 1343d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1344d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1345d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 13461b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1347d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 13483a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 13491b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 13501b807ce4Svictorle } 1351289bc588SBarry Smith } 135277c4ece6SBarry Smith *flg = PETSC_TRUE; 13533a40ed3dSBarry Smith PetscFunctionReturn(0); 1354289bc588SBarry Smith } 1355289bc588SBarry Smith 13564a2ae208SSatish Balay #undef __FUNCT__ 13574a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1358dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1359289bc588SBarry Smith { 1360c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1361dfbe8321SBarry Smith PetscErrorCode ierr; 136213f74950SBarry Smith PetscInt i,n,len; 136387828ca2SBarry Smith PetscScalar *x,zero = 0.0; 136444cd7ae7SLois Curfman McInnes 13653a40ed3dSBarry Smith PetscFunctionBegin; 13662dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 13677a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 13681ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1369d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1370e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 137144cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 13721b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1373289bc588SBarry Smith } 13741ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 13753a40ed3dSBarry Smith PetscFunctionReturn(0); 1376289bc588SBarry Smith } 1377289bc588SBarry Smith 13784a2ae208SSatish Balay #undef __FUNCT__ 13794a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1380dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1381289bc588SBarry Smith { 1382c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1383f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1384f1ceaac6SMatthew G. Knepley PetscScalar x,*v; 1385dfbe8321SBarry Smith PetscErrorCode ierr; 1386d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 138755659b69SBarry Smith 13883a40ed3dSBarry Smith PetscFunctionBegin; 138928988994SBarry Smith if (ll) { 13907a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 1391f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr); 1392e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1393da3a660dSBarry Smith for (i=0; i<m; i++) { 1394da3a660dSBarry Smith x = l[i]; 1395da3a660dSBarry Smith v = mat->v + i; 1396b43bac26SStefano Zampini for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;} 1397da3a660dSBarry Smith } 1398f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr); 1399eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1400da3a660dSBarry Smith } 140128988994SBarry Smith if (rr) { 14027a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 1403f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr); 1404e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1405da3a660dSBarry Smith for (i=0; i<n; i++) { 1406da3a660dSBarry Smith x = r[i]; 1407b43bac26SStefano Zampini v = mat->v + i*mat->lda; 14082205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1409da3a660dSBarry Smith } 1410f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr); 1411eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1412da3a660dSBarry Smith } 14133a40ed3dSBarry Smith PetscFunctionReturn(0); 1414289bc588SBarry Smith } 1415289bc588SBarry Smith 14164a2ae208SSatish Balay #undef __FUNCT__ 14174a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1418dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1419289bc588SBarry Smith { 1420c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 142187828ca2SBarry Smith PetscScalar *v = mat->v; 1422329f5518SBarry Smith PetscReal sum = 0.0; 1423d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1424efee365bSSatish Balay PetscErrorCode ierr; 142555659b69SBarry Smith 14263a40ed3dSBarry Smith PetscFunctionBegin; 1427289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1428a5ce6ee0Svictorle if (lda>m) { 1429d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1430a5ce6ee0Svictorle v = mat->v+j*lda; 1431a5ce6ee0Svictorle for (i=0; i<m; i++) { 1432a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1433a5ce6ee0Svictorle } 1434a5ce6ee0Svictorle } 1435a5ce6ee0Svictorle } else { 1436d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1437329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1438289bc588SBarry Smith } 1439a5ce6ee0Svictorle } 14408f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1441dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 14423a40ed3dSBarry Smith } else if (type == NORM_1) { 1443064f8208SBarry Smith *nrm = 0.0; 1444d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 14451b807ce4Svictorle v = mat->v + j*mat->lda; 1446289bc588SBarry Smith sum = 0.0; 1447d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 144833a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1449289bc588SBarry Smith } 1450064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1451289bc588SBarry Smith } 1452eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 14533a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1454064f8208SBarry Smith *nrm = 0.0; 1455d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1456289bc588SBarry Smith v = mat->v + j; 1457289bc588SBarry Smith sum = 0.0; 1458d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 14591b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1460289bc588SBarry Smith } 1461064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1462289bc588SBarry Smith } 1463eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1464e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 14653a40ed3dSBarry Smith PetscFunctionReturn(0); 1466289bc588SBarry Smith } 1467289bc588SBarry Smith 14684a2ae208SSatish Balay #undef __FUNCT__ 14694a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1470ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1471289bc588SBarry Smith { 1472c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 147363ba0a88SBarry Smith PetscErrorCode ierr; 147467e560aaSBarry Smith 14753a40ed3dSBarry Smith PetscFunctionBegin; 1476b5a2b587SKris Buschelman switch (op) { 1477b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 14784e0d8c25SBarry Smith aij->roworiented = flg; 1479b5a2b587SKris Buschelman break; 1480512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1481b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 14823971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 14834e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 148413fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1485b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1486b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 14875021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 14885021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 14895021d80fSJed Brown break; 14905021d80fSJed Brown case MAT_SPD: 149177e54ba9SKris Buschelman case MAT_SYMMETRIC: 149277e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 14939a4540c5SBarry Smith case MAT_HERMITIAN: 14949a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 14955021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 149677e54ba9SKris Buschelman break; 1497b5a2b587SKris Buschelman default: 1498e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 14993a40ed3dSBarry Smith } 15003a40ed3dSBarry Smith PetscFunctionReturn(0); 1501289bc588SBarry Smith } 1502289bc588SBarry Smith 15034a2ae208SSatish Balay #undef __FUNCT__ 15044a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1505dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A) 15066f0a148fSBarry Smith { 1507ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 15086849ba73SBarry Smith PetscErrorCode ierr; 1509d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 15103a40ed3dSBarry Smith 15113a40ed3dSBarry Smith PetscFunctionBegin; 1512a5ce6ee0Svictorle if (lda>m) { 1513d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1514a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1515a5ce6ee0Svictorle } 1516a5ce6ee0Svictorle } else { 1517d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1518a5ce6ee0Svictorle } 15193a40ed3dSBarry Smith PetscFunctionReturn(0); 15206f0a148fSBarry Smith } 15216f0a148fSBarry Smith 15224a2ae208SSatish Balay #undef __FUNCT__ 15234a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 15242b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 15256f0a148fSBarry Smith { 152697b48c8fSBarry Smith PetscErrorCode ierr; 1527ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1528b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 152997b48c8fSBarry Smith PetscScalar *slot,*bb; 153097b48c8fSBarry Smith const PetscScalar *xx; 153155659b69SBarry Smith 15323a40ed3dSBarry Smith PetscFunctionBegin; 1533b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1534b9679d65SBarry Smith for (i=0; i<N; i++) { 1535b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1536b9679d65SBarry 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); 1537b9679d65SBarry Smith } 1538b9679d65SBarry Smith #endif 1539b9679d65SBarry Smith 154097b48c8fSBarry Smith /* fix right hand side if needed */ 154197b48c8fSBarry Smith if (x && b) { 154297b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 154397b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 15442205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 154597b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 154697b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 154797b48c8fSBarry Smith } 154897b48c8fSBarry Smith 15496f0a148fSBarry Smith for (i=0; i<N; i++) { 15506f0a148fSBarry Smith slot = l->v + rows[i]; 1551b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 15526f0a148fSBarry Smith } 1553f4df32b1SMatthew Knepley if (diag != 0.0) { 1554b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 15556f0a148fSBarry Smith for (i=0; i<N; i++) { 1556b9679d65SBarry Smith slot = l->v + (m+1)*rows[i]; 1557f4df32b1SMatthew Knepley *slot = diag; 15586f0a148fSBarry Smith } 15596f0a148fSBarry Smith } 15603a40ed3dSBarry Smith PetscFunctionReturn(0); 15616f0a148fSBarry Smith } 1562557bce09SLois Curfman McInnes 15634a2ae208SSatish Balay #undef __FUNCT__ 15648c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense" 15658c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[]) 156664e87e97SBarry Smith { 1567c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 15683a40ed3dSBarry Smith 15693a40ed3dSBarry Smith PetscFunctionBegin; 1570e32f2f54SBarry 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"); 157164e87e97SBarry Smith *array = mat->v; 15723a40ed3dSBarry Smith PetscFunctionReturn(0); 157364e87e97SBarry Smith } 15740754003eSLois Curfman McInnes 15754a2ae208SSatish Balay #undef __FUNCT__ 15768c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense" 15778c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1578ff14e315SSatish Balay { 15793a40ed3dSBarry Smith PetscFunctionBegin; 158009b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 15813a40ed3dSBarry Smith PetscFunctionReturn(0); 1582ff14e315SSatish Balay } 15830754003eSLois Curfman McInnes 15844a2ae208SSatish Balay #undef __FUNCT__ 15858c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray" 1586dec5eb66SMatthew G Knepley /*@C 15878c778c55SBarry Smith MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored 158873a71a0fSBarry Smith 158973a71a0fSBarry Smith Not Collective 159073a71a0fSBarry Smith 159173a71a0fSBarry Smith Input Parameter: 1592579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 159373a71a0fSBarry Smith 159473a71a0fSBarry Smith Output Parameter: 159573a71a0fSBarry Smith . array - pointer to the data 159673a71a0fSBarry Smith 159773a71a0fSBarry Smith Level: intermediate 159873a71a0fSBarry Smith 15998c778c55SBarry Smith .seealso: MatDenseRestoreArray() 160073a71a0fSBarry Smith @*/ 16018c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 160273a71a0fSBarry Smith { 160373a71a0fSBarry Smith PetscErrorCode ierr; 160473a71a0fSBarry Smith 160573a71a0fSBarry Smith PetscFunctionBegin; 16068c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 160773a71a0fSBarry Smith PetscFunctionReturn(0); 160873a71a0fSBarry Smith } 160973a71a0fSBarry Smith 161073a71a0fSBarry Smith #undef __FUNCT__ 16118c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray" 1612dec5eb66SMatthew G Knepley /*@C 1613579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 161473a71a0fSBarry Smith 161573a71a0fSBarry Smith Not Collective 161673a71a0fSBarry Smith 161773a71a0fSBarry Smith Input Parameters: 1618579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 161973a71a0fSBarry Smith . array - pointer to the data 162073a71a0fSBarry Smith 162173a71a0fSBarry Smith Level: intermediate 162273a71a0fSBarry Smith 16238c778c55SBarry Smith .seealso: MatDenseGetArray() 162473a71a0fSBarry Smith @*/ 16258c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 162673a71a0fSBarry Smith { 162773a71a0fSBarry Smith PetscErrorCode ierr; 162873a71a0fSBarry Smith 162973a71a0fSBarry Smith PetscFunctionBegin; 16308c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 163173a71a0fSBarry Smith PetscFunctionReturn(0); 163273a71a0fSBarry Smith } 163373a71a0fSBarry Smith 163473a71a0fSBarry Smith #undef __FUNCT__ 16354a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 163613f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 16370754003eSLois Curfman McInnes { 1638c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 16396849ba73SBarry Smith PetscErrorCode ierr; 16405d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 16415d0c19d7SBarry Smith const PetscInt *irow,*icol; 164287828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 16430754003eSLois Curfman McInnes Mat newmat; 16440754003eSLois Curfman McInnes 16453a40ed3dSBarry Smith PetscFunctionBegin; 164678b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 164778b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1648e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1649e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 16500754003eSLois Curfman McInnes 1651182d2002SSatish Balay /* Check submatrixcall */ 1652182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 165313f74950SBarry Smith PetscInt n_cols,n_rows; 1654182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 165521a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1656f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1657c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 165821a2c019SBarry Smith } 1659182d2002SSatish Balay newmat = *B; 1660182d2002SSatish Balay } else { 16610754003eSLois Curfman McInnes /* Create and fill new matrix */ 1662ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 1663f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 16647adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 16650298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1666182d2002SSatish Balay } 1667182d2002SSatish Balay 1668182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1669182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1670182d2002SSatish Balay 1671182d2002SSatish Balay for (i=0; i<ncols; i++) { 16726de62eeeSBarry Smith av = v + mat->lda*icol[i]; 16732205254eSKarl Rupp for (j=0; j<nrows; j++) *bv++ = av[irow[j]]; 16740754003eSLois Curfman McInnes } 1675182d2002SSatish Balay 1676182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 16776d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 16786d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 16790754003eSLois Curfman McInnes 16800754003eSLois Curfman McInnes /* Free work space */ 168178b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 168278b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1683182d2002SSatish Balay *B = newmat; 16843a40ed3dSBarry Smith PetscFunctionReturn(0); 16850754003eSLois Curfman McInnes } 16860754003eSLois Curfman McInnes 16874a2ae208SSatish Balay #undef __FUNCT__ 16884a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 168913f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1690905e6a2fSBarry Smith { 16916849ba73SBarry Smith PetscErrorCode ierr; 169213f74950SBarry Smith PetscInt i; 1693905e6a2fSBarry Smith 16943a40ed3dSBarry Smith PetscFunctionBegin; 1695905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1696854ce69bSBarry Smith ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr); 1697905e6a2fSBarry Smith } 1698905e6a2fSBarry Smith 1699905e6a2fSBarry Smith for (i=0; i<n; i++) { 17006a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1701905e6a2fSBarry Smith } 17023a40ed3dSBarry Smith PetscFunctionReturn(0); 1703905e6a2fSBarry Smith } 1704905e6a2fSBarry Smith 17054a2ae208SSatish Balay #undef __FUNCT__ 1706c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1707c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1708c0aa2d19SHong Zhang { 1709c0aa2d19SHong Zhang PetscFunctionBegin; 1710c0aa2d19SHong Zhang PetscFunctionReturn(0); 1711c0aa2d19SHong Zhang } 1712c0aa2d19SHong Zhang 1713c0aa2d19SHong Zhang #undef __FUNCT__ 1714c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1715c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1716c0aa2d19SHong Zhang { 1717c0aa2d19SHong Zhang PetscFunctionBegin; 1718c0aa2d19SHong Zhang PetscFunctionReturn(0); 1719c0aa2d19SHong Zhang } 1720c0aa2d19SHong Zhang 1721c0aa2d19SHong Zhang #undef __FUNCT__ 17224a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1723dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 17244b0e389bSBarry Smith { 17254b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 17266849ba73SBarry Smith PetscErrorCode ierr; 1727d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 17283a40ed3dSBarry Smith 17293a40ed3dSBarry Smith PetscFunctionBegin; 173033f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 173133f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1732cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 17333a40ed3dSBarry Smith PetscFunctionReturn(0); 17343a40ed3dSBarry Smith } 1735e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1736a5ce6ee0Svictorle if (lda1>m || lda2>m) { 17370dbb7854Svictorle for (j=0; j<n; j++) { 1738a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1739a5ce6ee0Svictorle } 1740a5ce6ee0Svictorle } else { 1741d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1742a5ce6ee0Svictorle } 1743273d9f13SBarry Smith PetscFunctionReturn(0); 1744273d9f13SBarry Smith } 1745273d9f13SBarry Smith 17464a2ae208SSatish Balay #undef __FUNCT__ 17474994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense" 17484994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A) 1749273d9f13SBarry Smith { 1750dfbe8321SBarry Smith PetscErrorCode ierr; 1751273d9f13SBarry Smith 1752273d9f13SBarry Smith PetscFunctionBegin; 1753273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 17543a40ed3dSBarry Smith PetscFunctionReturn(0); 17554b0e389bSBarry Smith } 17564b0e389bSBarry Smith 1757284134d9SBarry Smith #undef __FUNCT__ 1758ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense" 1759ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1760ba337c44SJed Brown { 1761ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1762ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1763ba337c44SJed Brown PetscScalar *aa = a->v; 1764ba337c44SJed Brown 1765ba337c44SJed Brown PetscFunctionBegin; 1766ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1767ba337c44SJed Brown PetscFunctionReturn(0); 1768ba337c44SJed Brown } 1769ba337c44SJed Brown 1770ba337c44SJed Brown #undef __FUNCT__ 1771ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense" 1772ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1773ba337c44SJed Brown { 1774ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1775ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1776ba337c44SJed Brown PetscScalar *aa = a->v; 1777ba337c44SJed Brown 1778ba337c44SJed Brown PetscFunctionBegin; 1779ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1780ba337c44SJed Brown PetscFunctionReturn(0); 1781ba337c44SJed Brown } 1782ba337c44SJed Brown 1783ba337c44SJed Brown #undef __FUNCT__ 1784ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense" 1785ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 1786ba337c44SJed Brown { 1787ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1788ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1789ba337c44SJed Brown PetscScalar *aa = a->v; 1790ba337c44SJed Brown 1791ba337c44SJed Brown PetscFunctionBegin; 1792ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 1793ba337c44SJed Brown PetscFunctionReturn(0); 1794ba337c44SJed Brown } 1795284134d9SBarry Smith 1796a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1797a9fe9ddaSSatish Balay #undef __FUNCT__ 1798a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1799a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1800a9fe9ddaSSatish Balay { 1801a9fe9ddaSSatish Balay PetscErrorCode ierr; 1802a9fe9ddaSSatish Balay 1803a9fe9ddaSSatish Balay PetscFunctionBegin; 1804a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 18053ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1806a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 18073ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1808a9fe9ddaSSatish Balay } 18093ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1810a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 18113ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1812a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1813a9fe9ddaSSatish Balay } 1814a9fe9ddaSSatish Balay 1815a9fe9ddaSSatish Balay #undef __FUNCT__ 1816a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1817a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1818a9fe9ddaSSatish Balay { 1819ee16a9a1SHong Zhang PetscErrorCode ierr; 1820d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1821ee16a9a1SHong Zhang Mat Cmat; 1822a9fe9ddaSSatish Balay 1823ee16a9a1SHong Zhang PetscFunctionBegin; 1824e32f2f54SBarry 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); 1825ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1826ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1827ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 18280298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 1829d73949e8SHong Zhang 1830ee16a9a1SHong Zhang *C = Cmat; 1831ee16a9a1SHong Zhang PetscFunctionReturn(0); 1832ee16a9a1SHong Zhang } 1833a9fe9ddaSSatish Balay 183498a3b096SSatish Balay #undef __FUNCT__ 1835a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1836a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1837a9fe9ddaSSatish Balay { 1838a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1839a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1840a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 18410805154bSBarry Smith PetscBLASInt m,n,k; 1842a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1843c5df96a5SBarry Smith PetscErrorCode ierr; 1844fd4e9aacSBarry Smith PetscBool flg; 1845a9fe9ddaSSatish Balay 1846a9fe9ddaSSatish Balay PetscFunctionBegin; 1847fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr); 1848fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense"); 1849fd4e9aacSBarry Smith 1850fd4e9aacSBarry Smith /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/ 1851fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr); 1852fd4e9aacSBarry Smith if (flg) { 1853fd4e9aacSBarry Smith C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense; 1854fd4e9aacSBarry Smith ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr); 1855fd4e9aacSBarry Smith PetscFunctionReturn(0); 1856fd4e9aacSBarry Smith } 1857fd4e9aacSBarry Smith 1858fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr); 1859fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense"); 1860c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1861c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1862c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 18635ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1864a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1865a9fe9ddaSSatish Balay } 1866a9fe9ddaSSatish Balay 1867a9fe9ddaSSatish Balay #undef __FUNCT__ 186875648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense" 186975648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1870a9fe9ddaSSatish Balay { 1871a9fe9ddaSSatish Balay PetscErrorCode ierr; 1872a9fe9ddaSSatish Balay 1873a9fe9ddaSSatish Balay PetscFunctionBegin; 1874a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 18753ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 187675648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 18773ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1878a9fe9ddaSSatish Balay } 18793ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 188075648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 18813ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1882a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1883a9fe9ddaSSatish Balay } 1884a9fe9ddaSSatish Balay 1885a9fe9ddaSSatish Balay #undef __FUNCT__ 188675648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense" 188775648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1888a9fe9ddaSSatish Balay { 1889ee16a9a1SHong Zhang PetscErrorCode ierr; 1890d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1891ee16a9a1SHong Zhang Mat Cmat; 1892a9fe9ddaSSatish Balay 1893ee16a9a1SHong Zhang PetscFunctionBegin; 1894e32f2f54SBarry 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); 1895ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1896ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1897ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 18980298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 18992205254eSKarl Rupp 1900ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 19012205254eSKarl Rupp 1902ee16a9a1SHong Zhang *C = Cmat; 1903ee16a9a1SHong Zhang PetscFunctionReturn(0); 1904ee16a9a1SHong Zhang } 1905a9fe9ddaSSatish Balay 1906a9fe9ddaSSatish Balay #undef __FUNCT__ 190775648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense" 190875648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1909a9fe9ddaSSatish Balay { 1910a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1911a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1912a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 19130805154bSBarry Smith PetscBLASInt m,n,k; 1914a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1915c5df96a5SBarry Smith PetscErrorCode ierr; 1916a9fe9ddaSSatish Balay 1917a9fe9ddaSSatish Balay PetscFunctionBegin; 1918c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr); 1919c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1920c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 19212fbe02b9SBarry Smith /* 19222fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 19232fbe02b9SBarry Smith */ 19245ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1925a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1926a9fe9ddaSSatish Balay } 1927985db425SBarry Smith 1928985db425SBarry Smith #undef __FUNCT__ 1929985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 1930985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1931985db425SBarry Smith { 1932985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1933985db425SBarry Smith PetscErrorCode ierr; 1934d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1935985db425SBarry Smith PetscScalar *x; 1936985db425SBarry Smith MatScalar *aa = a->v; 1937985db425SBarry Smith 1938985db425SBarry Smith PetscFunctionBegin; 1939e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1940985db425SBarry Smith 1941985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1942985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1943985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1944e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1945985db425SBarry Smith for (i=0; i<m; i++) { 1946985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1947985db425SBarry Smith for (j=1; j<n; j++) { 1948985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1949985db425SBarry Smith } 1950985db425SBarry Smith } 1951985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1952985db425SBarry Smith PetscFunctionReturn(0); 1953985db425SBarry Smith } 1954985db425SBarry Smith 1955985db425SBarry Smith #undef __FUNCT__ 1956985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 1957985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 1958985db425SBarry Smith { 1959985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1960985db425SBarry Smith PetscErrorCode ierr; 1961d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1962985db425SBarry Smith PetscScalar *x; 1963985db425SBarry Smith PetscReal atmp; 1964985db425SBarry Smith MatScalar *aa = a->v; 1965985db425SBarry Smith 1966985db425SBarry Smith PetscFunctionBegin; 1967e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1968985db425SBarry Smith 1969985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1970985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1971985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1972e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1973985db425SBarry Smith for (i=0; i<m; i++) { 19749189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 1975985db425SBarry Smith for (j=1; j<n; j++) { 1976985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 1977985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 1978985db425SBarry Smith } 1979985db425SBarry Smith } 1980985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1981985db425SBarry Smith PetscFunctionReturn(0); 1982985db425SBarry Smith } 1983985db425SBarry Smith 1984985db425SBarry Smith #undef __FUNCT__ 1985985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 1986985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 1987985db425SBarry Smith { 1988985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1989985db425SBarry Smith PetscErrorCode ierr; 1990d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1991985db425SBarry Smith PetscScalar *x; 1992985db425SBarry Smith MatScalar *aa = a->v; 1993985db425SBarry Smith 1994985db425SBarry Smith PetscFunctionBegin; 1995e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1996985db425SBarry Smith 1997985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1998985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1999985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2000e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2001985db425SBarry Smith for (i=0; i<m; i++) { 2002985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2003985db425SBarry Smith for (j=1; j<n; j++) { 2004985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 2005985db425SBarry Smith } 2006985db425SBarry Smith } 2007985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2008985db425SBarry Smith PetscFunctionReturn(0); 2009985db425SBarry Smith } 2010985db425SBarry Smith 20118d0534beSBarry Smith #undef __FUNCT__ 20128d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 20138d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 20148d0534beSBarry Smith { 20158d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 20168d0534beSBarry Smith PetscErrorCode ierr; 20178d0534beSBarry Smith PetscScalar *x; 20188d0534beSBarry Smith 20198d0534beSBarry Smith PetscFunctionBegin; 2020e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 20218d0534beSBarry Smith 20228d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2023d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 20248d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 20258d0534beSBarry Smith PetscFunctionReturn(0); 20268d0534beSBarry Smith } 20278d0534beSBarry Smith 20280716a85fSBarry Smith 20290716a85fSBarry Smith #undef __FUNCT__ 20300716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense" 20310716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 20320716a85fSBarry Smith { 20330716a85fSBarry Smith PetscErrorCode ierr; 20340716a85fSBarry Smith PetscInt i,j,m,n; 20350716a85fSBarry Smith PetscScalar *a; 20360716a85fSBarry Smith 20370716a85fSBarry Smith PetscFunctionBegin; 20380716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 20390716a85fSBarry Smith ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); 20408c778c55SBarry Smith ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr); 20410716a85fSBarry Smith if (type == NORM_2) { 20420716a85fSBarry Smith for (i=0; i<n; i++) { 20430716a85fSBarry Smith for (j=0; j<m; j++) { 20440716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 20450716a85fSBarry Smith } 20460716a85fSBarry Smith a += m; 20470716a85fSBarry Smith } 20480716a85fSBarry Smith } else if (type == NORM_1) { 20490716a85fSBarry Smith for (i=0; i<n; i++) { 20500716a85fSBarry Smith for (j=0; j<m; j++) { 20510716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 20520716a85fSBarry Smith } 20530716a85fSBarry Smith a += m; 20540716a85fSBarry Smith } 20550716a85fSBarry Smith } else if (type == NORM_INFINITY) { 20560716a85fSBarry Smith for (i=0; i<n; i++) { 20570716a85fSBarry Smith for (j=0; j<m; j++) { 20580716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 20590716a85fSBarry Smith } 20600716a85fSBarry Smith a += m; 20610716a85fSBarry Smith } 2062ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 20638c778c55SBarry Smith ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr); 20640716a85fSBarry Smith if (type == NORM_2) { 20658f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 20660716a85fSBarry Smith } 20670716a85fSBarry Smith PetscFunctionReturn(0); 20680716a85fSBarry Smith } 20690716a85fSBarry Smith 207073a71a0fSBarry Smith #undef __FUNCT__ 207173a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense" 207273a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 207373a71a0fSBarry Smith { 207473a71a0fSBarry Smith PetscErrorCode ierr; 207573a71a0fSBarry Smith PetscScalar *a; 207673a71a0fSBarry Smith PetscInt m,n,i; 207773a71a0fSBarry Smith 207873a71a0fSBarry Smith PetscFunctionBegin; 207973a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 20808c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 208173a71a0fSBarry Smith for (i=0; i<m*n; i++) { 208273a71a0fSBarry Smith ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr); 208373a71a0fSBarry Smith } 20848c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 208573a71a0fSBarry Smith PetscFunctionReturn(0); 208673a71a0fSBarry Smith } 208773a71a0fSBarry Smith 20883b49f96aSBarry Smith #undef __FUNCT__ 20893b49f96aSBarry Smith #define __FUNCT__ "MatMissingDiagonal_SeqDense" 20903b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool *missing,PetscInt *d) 20913b49f96aSBarry Smith { 20923b49f96aSBarry Smith PetscFunctionBegin; 20933b49f96aSBarry Smith *missing = PETSC_FALSE; 20943b49f96aSBarry Smith PetscFunctionReturn(0); 20953b49f96aSBarry Smith } 209673a71a0fSBarry Smith 2097abc3b08eSStefano Zampini 2098289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2099a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2100905e6a2fSBarry Smith MatGetRow_SeqDense, 2101905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2102905e6a2fSBarry Smith MatMult_SeqDense, 210397304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 21047c922b88SBarry Smith MatMultTranspose_SeqDense, 21057c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2106db4efbfdSBarry Smith 0, 2107db4efbfdSBarry Smith 0, 2108db4efbfdSBarry Smith 0, 2109db4efbfdSBarry Smith /* 10*/ 0, 2110905e6a2fSBarry Smith MatLUFactor_SeqDense, 2111905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 211241f059aeSBarry Smith MatSOR_SeqDense, 2113ec8511deSBarry Smith MatTranspose_SeqDense, 211497304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2115905e6a2fSBarry Smith MatEqual_SeqDense, 2116905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2117905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2118905e6a2fSBarry Smith MatNorm_SeqDense, 2119c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2120c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2121905e6a2fSBarry Smith MatSetOption_SeqDense, 2122905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2123d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2124db4efbfdSBarry Smith 0, 2125db4efbfdSBarry Smith 0, 2126db4efbfdSBarry Smith 0, 2127db4efbfdSBarry Smith 0, 21284994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2129273d9f13SBarry Smith 0, 2130905e6a2fSBarry Smith 0, 213173a71a0fSBarry Smith 0, 213273a71a0fSBarry Smith 0, 2133d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2134a5ae1ecdSBarry Smith 0, 2135a5ae1ecdSBarry Smith 0, 2136a5ae1ecdSBarry Smith 0, 2137a5ae1ecdSBarry Smith 0, 2138d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 2139a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 2140a5ae1ecdSBarry Smith 0, 21414b0e389bSBarry Smith MatGetValues_SeqDense, 2142a5ae1ecdSBarry Smith MatCopy_SeqDense, 2143d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2144a5ae1ecdSBarry Smith MatScale_SeqDense, 21457d68702bSBarry Smith MatShift_Basic, 2146a5ae1ecdSBarry Smith 0, 2147a5ae1ecdSBarry Smith 0, 214873a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2149a5ae1ecdSBarry Smith 0, 2150a5ae1ecdSBarry Smith 0, 2151a5ae1ecdSBarry Smith 0, 2152a5ae1ecdSBarry Smith 0, 2153d519adbfSMatthew Knepley /* 54*/ 0, 2154a5ae1ecdSBarry Smith 0, 2155a5ae1ecdSBarry Smith 0, 2156a5ae1ecdSBarry Smith 0, 2157a5ae1ecdSBarry Smith 0, 2158d519adbfSMatthew Knepley /* 59*/ 0, 2159e03a110bSBarry Smith MatDestroy_SeqDense, 2160e03a110bSBarry Smith MatView_SeqDense, 2161357abbc8SBarry Smith 0, 216297304618SKris Buschelman 0, 2163d519adbfSMatthew Knepley /* 64*/ 0, 216497304618SKris Buschelman 0, 216597304618SKris Buschelman 0, 216697304618SKris Buschelman 0, 216797304618SKris Buschelman 0, 2168d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 216997304618SKris Buschelman 0, 217097304618SKris Buschelman 0, 217197304618SKris Buschelman 0, 217297304618SKris Buschelman 0, 2173d519adbfSMatthew Knepley /* 74*/ 0, 217497304618SKris Buschelman 0, 217597304618SKris Buschelman 0, 217697304618SKris Buschelman 0, 217797304618SKris Buschelman 0, 2178d519adbfSMatthew Knepley /* 79*/ 0, 217997304618SKris Buschelman 0, 218097304618SKris Buschelman 0, 218197304618SKris Buschelman 0, 21825bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2183865e5f61SKris Buschelman 0, 21841cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2185865e5f61SKris Buschelman 0, 2186865e5f61SKris Buschelman 0, 2187865e5f61SKris Buschelman 0, 2188d519adbfSMatthew Knepley /* 89*/ MatMatMult_SeqDense_SeqDense, 2189a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 2190a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2191abc3b08eSStefano Zampini MatPtAP_SeqDense_SeqDense, 2192abc3b08eSStefano Zampini MatPtAPSymbolic_SeqDense_SeqDense, 2193abc3b08eSStefano Zampini /* 94*/ MatPtAPNumeric_SeqDense_SeqDense, 21945df89d91SHong Zhang 0, 21955df89d91SHong Zhang 0, 21965df89d91SHong Zhang 0, 2197284134d9SBarry Smith 0, 2198d519adbfSMatthew Knepley /* 99*/ 0, 2199284134d9SBarry Smith 0, 2200284134d9SBarry Smith 0, 2201ba337c44SJed Brown MatConjugate_SeqDense, 2202f73d5cc4SBarry Smith 0, 2203ba337c44SJed Brown /*104*/ 0, 2204ba337c44SJed Brown MatRealPart_SeqDense, 2205ba337c44SJed Brown MatImaginaryPart_SeqDense, 2206985db425SBarry Smith 0, 2207985db425SBarry Smith 0, 220885e2c93fSHong Zhang /*109*/ MatMatSolve_SeqDense, 2209985db425SBarry Smith 0, 22108d0534beSBarry Smith MatGetRowMin_SeqDense, 2211aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 22123b49f96aSBarry Smith MatMissingDiagonal_SeqDense, 2213aabbc4fbSShri Abhyankar /*114*/ 0, 2214aabbc4fbSShri Abhyankar 0, 2215aabbc4fbSShri Abhyankar 0, 2216aabbc4fbSShri Abhyankar 0, 2217aabbc4fbSShri Abhyankar 0, 2218aabbc4fbSShri Abhyankar /*119*/ 0, 2219aabbc4fbSShri Abhyankar 0, 2220aabbc4fbSShri Abhyankar 0, 22210716a85fSBarry Smith 0, 22220716a85fSBarry Smith 0, 22230716a85fSBarry Smith /*124*/ 0, 22245df89d91SHong Zhang MatGetColumnNorms_SeqDense, 22255df89d91SHong Zhang 0, 22265df89d91SHong Zhang 0, 22275df89d91SHong Zhang 0, 22285df89d91SHong Zhang /*129*/ 0, 222975648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 223075648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 223175648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 22323964eb88SJed Brown 0, 22333964eb88SJed Brown /*134*/ 0, 22343964eb88SJed Brown 0, 22353964eb88SJed Brown 0, 22363964eb88SJed Brown 0, 22373964eb88SJed Brown 0, 22383964eb88SJed Brown /*139*/ 0, 2239f9426fe0SMark Adams 0, 22403964eb88SJed Brown 0 2241985db425SBarry Smith }; 224290ace30eSBarry Smith 22434a2ae208SSatish Balay #undef __FUNCT__ 22444a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 22454b828684SBarry Smith /*@C 2246fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2247d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2248d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2249289bc588SBarry Smith 2250db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2251db81eaa0SLois Curfman McInnes 225220563c6bSBarry Smith Input Parameters: 2253db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 22540c775827SLois Curfman McInnes . m - number of rows 225518f449edSLois Curfman McInnes . n - number of columns 22560298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2257dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 225820563c6bSBarry Smith 225920563c6bSBarry Smith Output Parameter: 226044cd7ae7SLois Curfman McInnes . A - the matrix 226120563c6bSBarry Smith 2262b259b22eSLois Curfman McInnes Notes: 226318f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 226418f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 22650298fd71SBarry Smith set data=NULL. 226618f449edSLois Curfman McInnes 2267027ccd11SLois Curfman McInnes Level: intermediate 2268027ccd11SLois Curfman McInnes 2269dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 2270d65003e9SLois Curfman McInnes 227169b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 227220563c6bSBarry Smith @*/ 22737087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2274289bc588SBarry Smith { 2275dfbe8321SBarry Smith PetscErrorCode ierr; 22763b2fbd54SBarry Smith 22773a40ed3dSBarry Smith PetscFunctionBegin; 2278f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2279f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2280273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2281273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2282273d9f13SBarry Smith PetscFunctionReturn(0); 2283273d9f13SBarry Smith } 2284273d9f13SBarry Smith 22854a2ae208SSatish Balay #undef __FUNCT__ 2286afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 2287273d9f13SBarry Smith /*@C 2288273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2289273d9f13SBarry Smith 2290273d9f13SBarry Smith Collective on MPI_Comm 2291273d9f13SBarry Smith 2292273d9f13SBarry Smith Input Parameters: 22931c4f3114SJed Brown + B - the matrix 22940298fd71SBarry Smith - data - the array (or NULL) 2295273d9f13SBarry Smith 2296273d9f13SBarry Smith Notes: 2297273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2298273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2299284134d9SBarry Smith need not call this routine. 2300273d9f13SBarry Smith 2301273d9f13SBarry Smith Level: intermediate 2302273d9f13SBarry Smith 2303273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2304273d9f13SBarry Smith 230569b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2306867c911aSBarry Smith 2307273d9f13SBarry Smith @*/ 23087087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2309273d9f13SBarry Smith { 23104ac538c5SBarry Smith PetscErrorCode ierr; 2311a23d5eceSKris Buschelman 2312a23d5eceSKris Buschelman PetscFunctionBegin; 23134ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2314a23d5eceSKris Buschelman PetscFunctionReturn(0); 2315a23d5eceSKris Buschelman } 2316a23d5eceSKris Buschelman 2317a23d5eceSKris Buschelman #undef __FUNCT__ 2318afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 23197087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2320a23d5eceSKris Buschelman { 2321273d9f13SBarry Smith Mat_SeqDense *b; 2322dfbe8321SBarry Smith PetscErrorCode ierr; 2323273d9f13SBarry Smith 2324273d9f13SBarry Smith PetscFunctionBegin; 2325273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2326a868139aSShri Abhyankar 232734ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 232834ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 232934ef9618SShri Abhyankar 2330273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 233186d161a7SShri Abhyankar b->Mmax = B->rmap->n; 233286d161a7SShri Abhyankar b->Nmax = B->cmap->n; 233386d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 233486d161a7SShri Abhyankar 23359e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 23369e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2337e92229d0SSatish Balay ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr); 23383bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 23392205254eSKarl Rupp 23409e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2341273d9f13SBarry Smith } else { /* user-allocated storage */ 23429e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2343273d9f13SBarry Smith b->v = data; 2344273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2345273d9f13SBarry Smith } 23460450473dSBarry Smith B->assembled = PETSC_TRUE; 2347273d9f13SBarry Smith PetscFunctionReturn(0); 2348273d9f13SBarry Smith } 2349273d9f13SBarry Smith 235065b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 23511b807ce4Svictorle #undef __FUNCT__ 23528baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental" 23538baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 23548baccfbdSHong Zhang { 2355d77f618aSHong Zhang Mat mat_elemental; 2356d77f618aSHong Zhang PetscErrorCode ierr; 2357d77f618aSHong Zhang PetscScalar *array,*v_colwise; 2358d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 2359d77f618aSHong Zhang 23608baccfbdSHong Zhang PetscFunctionBegin; 2361d77f618aSHong Zhang ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr); 2362d77f618aSHong Zhang ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr); 2363d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 2364d77f618aSHong Zhang k = 0; 2365d77f618aSHong Zhang for (j=0; j<N; j++) { 2366d77f618aSHong Zhang cols[j] = j; 2367d77f618aSHong Zhang for (i=0; i<M; i++) { 2368d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 2369d77f618aSHong Zhang } 2370d77f618aSHong Zhang } 2371d77f618aSHong Zhang for (i=0; i<M; i++) { 2372d77f618aSHong Zhang rows[i] = i; 2373d77f618aSHong Zhang } 2374d77f618aSHong Zhang ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr); 2375d77f618aSHong Zhang 2376d77f618aSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr); 2377d77f618aSHong Zhang ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 2378d77f618aSHong Zhang ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr); 2379d77f618aSHong Zhang ierr = MatSetUp(mat_elemental);CHKERRQ(ierr); 2380d77f618aSHong Zhang 2381d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 2382d77f618aSHong Zhang ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr); 2383d77f618aSHong Zhang ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2384d77f618aSHong Zhang ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2385d77f618aSHong Zhang ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr); 2386d77f618aSHong Zhang 2387511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 238828be2f97SBarry Smith ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr); 2389d77f618aSHong Zhang } else { 2390d77f618aSHong Zhang *newmat = mat_elemental; 2391d77f618aSHong Zhang } 23928baccfbdSHong Zhang PetscFunctionReturn(0); 23938baccfbdSHong Zhang } 239465b80a83SHong Zhang #endif 23958baccfbdSHong Zhang 23968baccfbdSHong Zhang #undef __FUNCT__ 23971b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 23981b807ce4Svictorle /*@C 23991b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 24001b807ce4Svictorle 24011b807ce4Svictorle Input parameter: 24021b807ce4Svictorle + A - the matrix 24031b807ce4Svictorle - lda - the leading dimension 24041b807ce4Svictorle 24051b807ce4Svictorle Notes: 2406867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 24071b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 24081b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 24091b807ce4Svictorle 24101b807ce4Svictorle Level: intermediate 24111b807ce4Svictorle 24121b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 24131b807ce4Svictorle 2414284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2415867c911aSBarry Smith 24161b807ce4Svictorle @*/ 24177087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 24181b807ce4Svictorle { 24191b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 242021a2c019SBarry Smith 24211b807ce4Svictorle PetscFunctionBegin; 2422e32f2f54SBarry 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); 24231b807ce4Svictorle b->lda = lda; 242421a2c019SBarry Smith b->changelda = PETSC_FALSE; 242521a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 24261b807ce4Svictorle PetscFunctionReturn(0); 24271b807ce4Svictorle } 24281b807ce4Svictorle 24290bad9183SKris Buschelman /*MC 2430fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 24310bad9183SKris Buschelman 24320bad9183SKris Buschelman Options Database Keys: 24330bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 24340bad9183SKris Buschelman 24350bad9183SKris Buschelman Level: beginner 24360bad9183SKris Buschelman 243789665df3SBarry Smith .seealso: MatCreateSeqDense() 243889665df3SBarry Smith 24390bad9183SKris Buschelman M*/ 24400bad9183SKris Buschelman 24414a2ae208SSatish Balay #undef __FUNCT__ 24424a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 24438cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B) 2444273d9f13SBarry Smith { 2445273d9f13SBarry Smith Mat_SeqDense *b; 2446dfbe8321SBarry Smith PetscErrorCode ierr; 24477c334f02SBarry Smith PetscMPIInt size; 2448273d9f13SBarry Smith 2449273d9f13SBarry Smith PetscFunctionBegin; 2450ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 2451e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 245255659b69SBarry Smith 2453b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 2454549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 245544cd7ae7SLois Curfman McInnes B->data = (void*)b; 245618f449edSLois Curfman McInnes 245744cd7ae7SLois Curfman McInnes b->pivots = 0; 2458273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2459273d9f13SBarry Smith b->v = 0; 246021a2c019SBarry Smith b->changelda = PETSC_FALSE; 24614e220ebcSLois Curfman McInnes 2462bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 2463bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2464bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 24658baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 24668baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 24678baccfbdSHong Zhang #endif 2468bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 2469bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2470bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2471bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2472abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 24733bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 24743bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 24753bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 247617667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 24773a40ed3dSBarry Smith PetscFunctionReturn(0); 2478289bc588SBarry Smith } 2479