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; 1143*383922c3SLisandro Dalcin PetscInt m = A->rmap->n,n = A->cmap->n,i,j; 1144*383922c3SLisandro 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 */ 1156*383922c3SLisandro Dalcin 1157fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1158*383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1159f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1160f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1161*383922c3SLisandro 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 } 1175*383922c3SLisandro 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 } 1185*383922c3SLisandro 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);} 1188*383922c3SLisandro Dalcin 1189*383922c3SLisandro 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 } 1200*383922c3SLisandro 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 1219f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1220d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1221f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1222b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1223b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 12240298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1225f1af5d2fSBarry Smith PetscFunctionReturn(0); 1226f1af5d2fSBarry Smith } 1227f1af5d2fSBarry Smith 12284a2ae208SSatish Balay #undef __FUNCT__ 12294a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 1230dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1231932b0c3eSLois Curfman McInnes { 1232dfbe8321SBarry Smith PetscErrorCode ierr; 1233ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1234932b0c3eSLois Curfman McInnes 12353a40ed3dSBarry Smith PetscFunctionBegin; 1236251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1237251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1238251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 12390f5bd95cSBarry Smith 1240c45a1595SBarry Smith if (iascii) { 1241c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 12420f5bd95cSBarry Smith } else if (isbinary) { 12433a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1244f1af5d2fSBarry Smith } else if (isdraw) { 1245f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1246932b0c3eSLois Curfman McInnes } 12473a40ed3dSBarry Smith PetscFunctionReturn(0); 1248932b0c3eSLois Curfman McInnes } 1249289bc588SBarry Smith 12504a2ae208SSatish Balay #undef __FUNCT__ 12514a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1252dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat) 1253289bc588SBarry Smith { 1254ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1255dfbe8321SBarry Smith PetscErrorCode ierr; 125690f02eecSBarry Smith 12573a40ed3dSBarry Smith PetscFunctionBegin; 1258aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1259d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1260a5a9c739SBarry Smith #endif 126105b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 1262abc3b08eSStefano Zampini ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr); 12636857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1264bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1265dbd8c25aSHong Zhang 1266dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1267bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 1268bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 12698baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 12708baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 12718baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 12728baccfbdSHong Zhang #endif 1273bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 1274bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1275bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1276bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1277abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12783bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12793bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12803bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12813a40ed3dSBarry Smith PetscFunctionReturn(0); 1282289bc588SBarry Smith } 1283289bc588SBarry Smith 12844a2ae208SSatish Balay #undef __FUNCT__ 12854a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1286fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1287289bc588SBarry Smith { 1288c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 12896849ba73SBarry Smith PetscErrorCode ierr; 129013f74950SBarry Smith PetscInt k,j,m,n,M; 129187828ca2SBarry Smith PetscScalar *v,tmp; 129248b35521SBarry Smith 12933a40ed3dSBarry Smith PetscFunctionBegin; 1294d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 1295e9695a30SBarry Smith if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */ 1296e7e72b3dSBarry Smith if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1297e7e72b3dSBarry Smith else { 1298d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1299289bc588SBarry Smith for (k=0; k<j; k++) { 13001b807ce4Svictorle tmp = v[j + k*M]; 13011b807ce4Svictorle v[j + k*M] = v[k + j*M]; 13021b807ce4Svictorle v[k + j*M] = tmp; 1303289bc588SBarry Smith } 1304289bc588SBarry Smith } 1305d64ed03dSBarry Smith } 13063a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1307d3e5ee88SLois Curfman McInnes Mat tmat; 1308ec8511deSBarry Smith Mat_SeqDense *tmatd; 130987828ca2SBarry Smith PetscScalar *v2; 1310af36a384SStefano Zampini PetscInt M2; 1311ea709b57SSatish Balay 1312fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX) { 1313ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1314d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 13157adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 13160298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1317fc4dec0aSBarry Smith } else { 1318fc4dec0aSBarry Smith tmat = *matout; 1319fc4dec0aSBarry Smith } 1320ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 1321af36a384SStefano Zampini v = mat->v; v2 = tmatd->v; M2 = tmatd->lda; 1322d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 1323af36a384SStefano Zampini for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M]; 1324d3e5ee88SLois Curfman McInnes } 13256d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 13266d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1327d3e5ee88SLois Curfman McInnes *matout = tmat; 132848b35521SBarry Smith } 13293a40ed3dSBarry Smith PetscFunctionReturn(0); 1330289bc588SBarry Smith } 1331289bc588SBarry Smith 13324a2ae208SSatish Balay #undef __FUNCT__ 13334a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1334ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1335289bc588SBarry Smith { 1336c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1337c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 133813f74950SBarry Smith PetscInt i,j; 1339a2ea699eSBarry Smith PetscScalar *v1,*v2; 13409ea5d5aeSSatish Balay 13413a40ed3dSBarry Smith PetscFunctionBegin; 1342d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1343d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1344d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 13451b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1346d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 13473a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 13481b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 13491b807ce4Svictorle } 1350289bc588SBarry Smith } 135177c4ece6SBarry Smith *flg = PETSC_TRUE; 13523a40ed3dSBarry Smith PetscFunctionReturn(0); 1353289bc588SBarry Smith } 1354289bc588SBarry Smith 13554a2ae208SSatish Balay #undef __FUNCT__ 13564a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1357dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1358289bc588SBarry Smith { 1359c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1360dfbe8321SBarry Smith PetscErrorCode ierr; 136113f74950SBarry Smith PetscInt i,n,len; 136287828ca2SBarry Smith PetscScalar *x,zero = 0.0; 136344cd7ae7SLois Curfman McInnes 13643a40ed3dSBarry Smith PetscFunctionBegin; 13652dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 13667a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 13671ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1368d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1369e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 137044cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 13711b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1372289bc588SBarry Smith } 13731ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 13743a40ed3dSBarry Smith PetscFunctionReturn(0); 1375289bc588SBarry Smith } 1376289bc588SBarry Smith 13774a2ae208SSatish Balay #undef __FUNCT__ 13784a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1379dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1380289bc588SBarry Smith { 1381c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1382f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1383f1ceaac6SMatthew G. Knepley PetscScalar x,*v; 1384dfbe8321SBarry Smith PetscErrorCode ierr; 1385d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 138655659b69SBarry Smith 13873a40ed3dSBarry Smith PetscFunctionBegin; 138828988994SBarry Smith if (ll) { 13897a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 1390f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr); 1391e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1392da3a660dSBarry Smith for (i=0; i<m; i++) { 1393da3a660dSBarry Smith x = l[i]; 1394da3a660dSBarry Smith v = mat->v + i; 1395b43bac26SStefano Zampini for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;} 1396da3a660dSBarry Smith } 1397f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr); 1398eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1399da3a660dSBarry Smith } 140028988994SBarry Smith if (rr) { 14017a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 1402f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr); 1403e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1404da3a660dSBarry Smith for (i=0; i<n; i++) { 1405da3a660dSBarry Smith x = r[i]; 1406b43bac26SStefano Zampini v = mat->v + i*mat->lda; 14072205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1408da3a660dSBarry Smith } 1409f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr); 1410eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1411da3a660dSBarry Smith } 14123a40ed3dSBarry Smith PetscFunctionReturn(0); 1413289bc588SBarry Smith } 1414289bc588SBarry Smith 14154a2ae208SSatish Balay #undef __FUNCT__ 14164a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1417dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1418289bc588SBarry Smith { 1419c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 142087828ca2SBarry Smith PetscScalar *v = mat->v; 1421329f5518SBarry Smith PetscReal sum = 0.0; 1422d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1423efee365bSSatish Balay PetscErrorCode ierr; 142455659b69SBarry Smith 14253a40ed3dSBarry Smith PetscFunctionBegin; 1426289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1427a5ce6ee0Svictorle if (lda>m) { 1428d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1429a5ce6ee0Svictorle v = mat->v+j*lda; 1430a5ce6ee0Svictorle for (i=0; i<m; i++) { 1431a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1432a5ce6ee0Svictorle } 1433a5ce6ee0Svictorle } 1434a5ce6ee0Svictorle } else { 1435d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1436329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1437289bc588SBarry Smith } 1438a5ce6ee0Svictorle } 14398f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1440dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 14413a40ed3dSBarry Smith } else if (type == NORM_1) { 1442064f8208SBarry Smith *nrm = 0.0; 1443d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 14441b807ce4Svictorle v = mat->v + j*mat->lda; 1445289bc588SBarry Smith sum = 0.0; 1446d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 144733a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1448289bc588SBarry Smith } 1449064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1450289bc588SBarry Smith } 1451eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 14523a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1453064f8208SBarry Smith *nrm = 0.0; 1454d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1455289bc588SBarry Smith v = mat->v + j; 1456289bc588SBarry Smith sum = 0.0; 1457d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 14581b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1459289bc588SBarry Smith } 1460064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1461289bc588SBarry Smith } 1462eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1463e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 14643a40ed3dSBarry Smith PetscFunctionReturn(0); 1465289bc588SBarry Smith } 1466289bc588SBarry Smith 14674a2ae208SSatish Balay #undef __FUNCT__ 14684a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1469ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1470289bc588SBarry Smith { 1471c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 147263ba0a88SBarry Smith PetscErrorCode ierr; 147367e560aaSBarry Smith 14743a40ed3dSBarry Smith PetscFunctionBegin; 1475b5a2b587SKris Buschelman switch (op) { 1476b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 14774e0d8c25SBarry Smith aij->roworiented = flg; 1478b5a2b587SKris Buschelman break; 1479512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1480b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 14813971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 14824e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 148313fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1484b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1485b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 14865021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 14875021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 14885021d80fSJed Brown break; 14895021d80fSJed Brown case MAT_SPD: 149077e54ba9SKris Buschelman case MAT_SYMMETRIC: 149177e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 14929a4540c5SBarry Smith case MAT_HERMITIAN: 14939a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 14945021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 149577e54ba9SKris Buschelman break; 1496b5a2b587SKris Buschelman default: 1497e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 14983a40ed3dSBarry Smith } 14993a40ed3dSBarry Smith PetscFunctionReturn(0); 1500289bc588SBarry Smith } 1501289bc588SBarry Smith 15024a2ae208SSatish Balay #undef __FUNCT__ 15034a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1504dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A) 15056f0a148fSBarry Smith { 1506ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 15076849ba73SBarry Smith PetscErrorCode ierr; 1508d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 15093a40ed3dSBarry Smith 15103a40ed3dSBarry Smith PetscFunctionBegin; 1511a5ce6ee0Svictorle if (lda>m) { 1512d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1513a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1514a5ce6ee0Svictorle } 1515a5ce6ee0Svictorle } else { 1516d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1517a5ce6ee0Svictorle } 15183a40ed3dSBarry Smith PetscFunctionReturn(0); 15196f0a148fSBarry Smith } 15206f0a148fSBarry Smith 15214a2ae208SSatish Balay #undef __FUNCT__ 15224a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 15232b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 15246f0a148fSBarry Smith { 152597b48c8fSBarry Smith PetscErrorCode ierr; 1526ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1527b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 152897b48c8fSBarry Smith PetscScalar *slot,*bb; 152997b48c8fSBarry Smith const PetscScalar *xx; 153055659b69SBarry Smith 15313a40ed3dSBarry Smith PetscFunctionBegin; 1532b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1533b9679d65SBarry Smith for (i=0; i<N; i++) { 1534b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1535b9679d65SBarry 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); 1536b9679d65SBarry Smith } 1537b9679d65SBarry Smith #endif 1538b9679d65SBarry Smith 153997b48c8fSBarry Smith /* fix right hand side if needed */ 154097b48c8fSBarry Smith if (x && b) { 154197b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 154297b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 15432205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 154497b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 154597b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 154697b48c8fSBarry Smith } 154797b48c8fSBarry Smith 15486f0a148fSBarry Smith for (i=0; i<N; i++) { 15496f0a148fSBarry Smith slot = l->v + rows[i]; 1550b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 15516f0a148fSBarry Smith } 1552f4df32b1SMatthew Knepley if (diag != 0.0) { 1553b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 15546f0a148fSBarry Smith for (i=0; i<N; i++) { 1555b9679d65SBarry Smith slot = l->v + (m+1)*rows[i]; 1556f4df32b1SMatthew Knepley *slot = diag; 15576f0a148fSBarry Smith } 15586f0a148fSBarry Smith } 15593a40ed3dSBarry Smith PetscFunctionReturn(0); 15606f0a148fSBarry Smith } 1561557bce09SLois Curfman McInnes 15624a2ae208SSatish Balay #undef __FUNCT__ 15638c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense" 15648c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[]) 156564e87e97SBarry Smith { 1566c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 15673a40ed3dSBarry Smith 15683a40ed3dSBarry Smith PetscFunctionBegin; 1569e32f2f54SBarry 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"); 157064e87e97SBarry Smith *array = mat->v; 15713a40ed3dSBarry Smith PetscFunctionReturn(0); 157264e87e97SBarry Smith } 15730754003eSLois Curfman McInnes 15744a2ae208SSatish Balay #undef __FUNCT__ 15758c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense" 15768c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1577ff14e315SSatish Balay { 15783a40ed3dSBarry Smith PetscFunctionBegin; 157909b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 15803a40ed3dSBarry Smith PetscFunctionReturn(0); 1581ff14e315SSatish Balay } 15820754003eSLois Curfman McInnes 15834a2ae208SSatish Balay #undef __FUNCT__ 15848c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray" 1585dec5eb66SMatthew G Knepley /*@C 15868c778c55SBarry Smith MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored 158773a71a0fSBarry Smith 158873a71a0fSBarry Smith Not Collective 158973a71a0fSBarry Smith 159073a71a0fSBarry Smith Input Parameter: 1591579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 159273a71a0fSBarry Smith 159373a71a0fSBarry Smith Output Parameter: 159473a71a0fSBarry Smith . array - pointer to the data 159573a71a0fSBarry Smith 159673a71a0fSBarry Smith Level: intermediate 159773a71a0fSBarry Smith 15988c778c55SBarry Smith .seealso: MatDenseRestoreArray() 159973a71a0fSBarry Smith @*/ 16008c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 160173a71a0fSBarry Smith { 160273a71a0fSBarry Smith PetscErrorCode ierr; 160373a71a0fSBarry Smith 160473a71a0fSBarry Smith PetscFunctionBegin; 16058c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 160673a71a0fSBarry Smith PetscFunctionReturn(0); 160773a71a0fSBarry Smith } 160873a71a0fSBarry Smith 160973a71a0fSBarry Smith #undef __FUNCT__ 16108c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray" 1611dec5eb66SMatthew G Knepley /*@C 1612579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 161373a71a0fSBarry Smith 161473a71a0fSBarry Smith Not Collective 161573a71a0fSBarry Smith 161673a71a0fSBarry Smith Input Parameters: 1617579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 161873a71a0fSBarry Smith . array - pointer to the data 161973a71a0fSBarry Smith 162073a71a0fSBarry Smith Level: intermediate 162173a71a0fSBarry Smith 16228c778c55SBarry Smith .seealso: MatDenseGetArray() 162373a71a0fSBarry Smith @*/ 16248c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 162573a71a0fSBarry Smith { 162673a71a0fSBarry Smith PetscErrorCode ierr; 162773a71a0fSBarry Smith 162873a71a0fSBarry Smith PetscFunctionBegin; 16298c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 163073a71a0fSBarry Smith PetscFunctionReturn(0); 163173a71a0fSBarry Smith } 163273a71a0fSBarry Smith 163373a71a0fSBarry Smith #undef __FUNCT__ 16344a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 163513f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 16360754003eSLois Curfman McInnes { 1637c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 16386849ba73SBarry Smith PetscErrorCode ierr; 16395d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 16405d0c19d7SBarry Smith const PetscInt *irow,*icol; 164187828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 16420754003eSLois Curfman McInnes Mat newmat; 16430754003eSLois Curfman McInnes 16443a40ed3dSBarry Smith PetscFunctionBegin; 164578b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 164678b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1647e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1648e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 16490754003eSLois Curfman McInnes 1650182d2002SSatish Balay /* Check submatrixcall */ 1651182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 165213f74950SBarry Smith PetscInt n_cols,n_rows; 1653182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 165421a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1655f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1656c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 165721a2c019SBarry Smith } 1658182d2002SSatish Balay newmat = *B; 1659182d2002SSatish Balay } else { 16600754003eSLois Curfman McInnes /* Create and fill new matrix */ 1661ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 1662f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 16637adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 16640298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1665182d2002SSatish Balay } 1666182d2002SSatish Balay 1667182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1668182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1669182d2002SSatish Balay 1670182d2002SSatish Balay for (i=0; i<ncols; i++) { 16716de62eeeSBarry Smith av = v + mat->lda*icol[i]; 16722205254eSKarl Rupp for (j=0; j<nrows; j++) *bv++ = av[irow[j]]; 16730754003eSLois Curfman McInnes } 1674182d2002SSatish Balay 1675182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 16766d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 16776d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 16780754003eSLois Curfman McInnes 16790754003eSLois Curfman McInnes /* Free work space */ 168078b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 168178b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1682182d2002SSatish Balay *B = newmat; 16833a40ed3dSBarry Smith PetscFunctionReturn(0); 16840754003eSLois Curfman McInnes } 16850754003eSLois Curfman McInnes 16864a2ae208SSatish Balay #undef __FUNCT__ 16874a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 168813f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1689905e6a2fSBarry Smith { 16906849ba73SBarry Smith PetscErrorCode ierr; 169113f74950SBarry Smith PetscInt i; 1692905e6a2fSBarry Smith 16933a40ed3dSBarry Smith PetscFunctionBegin; 1694905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1695854ce69bSBarry Smith ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr); 1696905e6a2fSBarry Smith } 1697905e6a2fSBarry Smith 1698905e6a2fSBarry Smith for (i=0; i<n; i++) { 16996a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1700905e6a2fSBarry Smith } 17013a40ed3dSBarry Smith PetscFunctionReturn(0); 1702905e6a2fSBarry Smith } 1703905e6a2fSBarry Smith 17044a2ae208SSatish Balay #undef __FUNCT__ 1705c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1706c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1707c0aa2d19SHong Zhang { 1708c0aa2d19SHong Zhang PetscFunctionBegin; 1709c0aa2d19SHong Zhang PetscFunctionReturn(0); 1710c0aa2d19SHong Zhang } 1711c0aa2d19SHong Zhang 1712c0aa2d19SHong Zhang #undef __FUNCT__ 1713c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1714c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1715c0aa2d19SHong Zhang { 1716c0aa2d19SHong Zhang PetscFunctionBegin; 1717c0aa2d19SHong Zhang PetscFunctionReturn(0); 1718c0aa2d19SHong Zhang } 1719c0aa2d19SHong Zhang 1720c0aa2d19SHong Zhang #undef __FUNCT__ 17214a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1722dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 17234b0e389bSBarry Smith { 17244b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 17256849ba73SBarry Smith PetscErrorCode ierr; 1726d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 17273a40ed3dSBarry Smith 17283a40ed3dSBarry Smith PetscFunctionBegin; 172933f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 173033f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1731cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 17323a40ed3dSBarry Smith PetscFunctionReturn(0); 17333a40ed3dSBarry Smith } 1734e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1735a5ce6ee0Svictorle if (lda1>m || lda2>m) { 17360dbb7854Svictorle for (j=0; j<n; j++) { 1737a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1738a5ce6ee0Svictorle } 1739a5ce6ee0Svictorle } else { 1740d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1741a5ce6ee0Svictorle } 1742273d9f13SBarry Smith PetscFunctionReturn(0); 1743273d9f13SBarry Smith } 1744273d9f13SBarry Smith 17454a2ae208SSatish Balay #undef __FUNCT__ 17464994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense" 17474994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A) 1748273d9f13SBarry Smith { 1749dfbe8321SBarry Smith PetscErrorCode ierr; 1750273d9f13SBarry Smith 1751273d9f13SBarry Smith PetscFunctionBegin; 1752273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 17533a40ed3dSBarry Smith PetscFunctionReturn(0); 17544b0e389bSBarry Smith } 17554b0e389bSBarry Smith 1756284134d9SBarry Smith #undef __FUNCT__ 1757ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense" 1758ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1759ba337c44SJed Brown { 1760ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1761ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1762ba337c44SJed Brown PetscScalar *aa = a->v; 1763ba337c44SJed Brown 1764ba337c44SJed Brown PetscFunctionBegin; 1765ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1766ba337c44SJed Brown PetscFunctionReturn(0); 1767ba337c44SJed Brown } 1768ba337c44SJed Brown 1769ba337c44SJed Brown #undef __FUNCT__ 1770ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense" 1771ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1772ba337c44SJed Brown { 1773ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1774ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1775ba337c44SJed Brown PetscScalar *aa = a->v; 1776ba337c44SJed Brown 1777ba337c44SJed Brown PetscFunctionBegin; 1778ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1779ba337c44SJed Brown PetscFunctionReturn(0); 1780ba337c44SJed Brown } 1781ba337c44SJed Brown 1782ba337c44SJed Brown #undef __FUNCT__ 1783ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense" 1784ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 1785ba337c44SJed Brown { 1786ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1787ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1788ba337c44SJed Brown PetscScalar *aa = a->v; 1789ba337c44SJed Brown 1790ba337c44SJed Brown PetscFunctionBegin; 1791ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 1792ba337c44SJed Brown PetscFunctionReturn(0); 1793ba337c44SJed Brown } 1794284134d9SBarry Smith 1795a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1796a9fe9ddaSSatish Balay #undef __FUNCT__ 1797a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1798a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1799a9fe9ddaSSatish Balay { 1800a9fe9ddaSSatish Balay PetscErrorCode ierr; 1801a9fe9ddaSSatish Balay 1802a9fe9ddaSSatish Balay PetscFunctionBegin; 1803a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 18043ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1805a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 18063ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1807a9fe9ddaSSatish Balay } 18083ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1809a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 18103ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1811a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1812a9fe9ddaSSatish Balay } 1813a9fe9ddaSSatish Balay 1814a9fe9ddaSSatish Balay #undef __FUNCT__ 1815a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1816a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1817a9fe9ddaSSatish Balay { 1818ee16a9a1SHong Zhang PetscErrorCode ierr; 1819d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1820ee16a9a1SHong Zhang Mat Cmat; 1821a9fe9ddaSSatish Balay 1822ee16a9a1SHong Zhang PetscFunctionBegin; 1823e32f2f54SBarry 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); 1824ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1825ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1826ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 18270298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 1828d73949e8SHong Zhang 1829ee16a9a1SHong Zhang *C = Cmat; 1830ee16a9a1SHong Zhang PetscFunctionReturn(0); 1831ee16a9a1SHong Zhang } 1832a9fe9ddaSSatish Balay 183398a3b096SSatish Balay #undef __FUNCT__ 1834a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1835a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1836a9fe9ddaSSatish Balay { 1837a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1838a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1839a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 18400805154bSBarry Smith PetscBLASInt m,n,k; 1841a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1842c5df96a5SBarry Smith PetscErrorCode ierr; 1843fd4e9aacSBarry Smith PetscBool flg; 1844a9fe9ddaSSatish Balay 1845a9fe9ddaSSatish Balay PetscFunctionBegin; 1846fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr); 1847fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense"); 1848fd4e9aacSBarry Smith 1849fd4e9aacSBarry Smith /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/ 1850fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr); 1851fd4e9aacSBarry Smith if (flg) { 1852fd4e9aacSBarry Smith C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense; 1853fd4e9aacSBarry Smith ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr); 1854fd4e9aacSBarry Smith PetscFunctionReturn(0); 1855fd4e9aacSBarry Smith } 1856fd4e9aacSBarry Smith 1857fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr); 1858fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense"); 1859c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1860c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1861c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 18625ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1863a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1864a9fe9ddaSSatish Balay } 1865a9fe9ddaSSatish Balay 1866a9fe9ddaSSatish Balay #undef __FUNCT__ 186775648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense" 186875648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1869a9fe9ddaSSatish Balay { 1870a9fe9ddaSSatish Balay PetscErrorCode ierr; 1871a9fe9ddaSSatish Balay 1872a9fe9ddaSSatish Balay PetscFunctionBegin; 1873a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 18743ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 187575648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 18763ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1877a9fe9ddaSSatish Balay } 18783ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 187975648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 18803ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1881a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1882a9fe9ddaSSatish Balay } 1883a9fe9ddaSSatish Balay 1884a9fe9ddaSSatish Balay #undef __FUNCT__ 188575648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense" 188675648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1887a9fe9ddaSSatish Balay { 1888ee16a9a1SHong Zhang PetscErrorCode ierr; 1889d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1890ee16a9a1SHong Zhang Mat Cmat; 1891a9fe9ddaSSatish Balay 1892ee16a9a1SHong Zhang PetscFunctionBegin; 1893e32f2f54SBarry 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); 1894ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1895ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1896ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 18970298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 18982205254eSKarl Rupp 1899ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 19002205254eSKarl Rupp 1901ee16a9a1SHong Zhang *C = Cmat; 1902ee16a9a1SHong Zhang PetscFunctionReturn(0); 1903ee16a9a1SHong Zhang } 1904a9fe9ddaSSatish Balay 1905a9fe9ddaSSatish Balay #undef __FUNCT__ 190675648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense" 190775648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1908a9fe9ddaSSatish Balay { 1909a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1910a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1911a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 19120805154bSBarry Smith PetscBLASInt m,n,k; 1913a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1914c5df96a5SBarry Smith PetscErrorCode ierr; 1915a9fe9ddaSSatish Balay 1916a9fe9ddaSSatish Balay PetscFunctionBegin; 1917c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr); 1918c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1919c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 19202fbe02b9SBarry Smith /* 19212fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 19222fbe02b9SBarry Smith */ 19235ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1924a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1925a9fe9ddaSSatish Balay } 1926985db425SBarry Smith 1927985db425SBarry Smith #undef __FUNCT__ 1928985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 1929985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1930985db425SBarry Smith { 1931985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1932985db425SBarry Smith PetscErrorCode ierr; 1933d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1934985db425SBarry Smith PetscScalar *x; 1935985db425SBarry Smith MatScalar *aa = a->v; 1936985db425SBarry Smith 1937985db425SBarry Smith PetscFunctionBegin; 1938e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1939985db425SBarry Smith 1940985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1941985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1942985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1943e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1944985db425SBarry Smith for (i=0; i<m; i++) { 1945985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1946985db425SBarry Smith for (j=1; j<n; j++) { 1947985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1948985db425SBarry Smith } 1949985db425SBarry Smith } 1950985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1951985db425SBarry Smith PetscFunctionReturn(0); 1952985db425SBarry Smith } 1953985db425SBarry Smith 1954985db425SBarry Smith #undef __FUNCT__ 1955985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 1956985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 1957985db425SBarry Smith { 1958985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1959985db425SBarry Smith PetscErrorCode ierr; 1960d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1961985db425SBarry Smith PetscScalar *x; 1962985db425SBarry Smith PetscReal atmp; 1963985db425SBarry Smith MatScalar *aa = a->v; 1964985db425SBarry Smith 1965985db425SBarry Smith PetscFunctionBegin; 1966e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1967985db425SBarry Smith 1968985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1969985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1970985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1971e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1972985db425SBarry Smith for (i=0; i<m; i++) { 19739189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 1974985db425SBarry Smith for (j=1; j<n; j++) { 1975985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 1976985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 1977985db425SBarry Smith } 1978985db425SBarry Smith } 1979985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1980985db425SBarry Smith PetscFunctionReturn(0); 1981985db425SBarry Smith } 1982985db425SBarry Smith 1983985db425SBarry Smith #undef __FUNCT__ 1984985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 1985985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 1986985db425SBarry Smith { 1987985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1988985db425SBarry Smith PetscErrorCode ierr; 1989d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1990985db425SBarry Smith PetscScalar *x; 1991985db425SBarry Smith MatScalar *aa = a->v; 1992985db425SBarry Smith 1993985db425SBarry Smith PetscFunctionBegin; 1994e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1995985db425SBarry Smith 1996985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1997985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1998985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1999e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2000985db425SBarry Smith for (i=0; i<m; i++) { 2001985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2002985db425SBarry Smith for (j=1; j<n; j++) { 2003985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 2004985db425SBarry Smith } 2005985db425SBarry Smith } 2006985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2007985db425SBarry Smith PetscFunctionReturn(0); 2008985db425SBarry Smith } 2009985db425SBarry Smith 20108d0534beSBarry Smith #undef __FUNCT__ 20118d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 20128d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 20138d0534beSBarry Smith { 20148d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 20158d0534beSBarry Smith PetscErrorCode ierr; 20168d0534beSBarry Smith PetscScalar *x; 20178d0534beSBarry Smith 20188d0534beSBarry Smith PetscFunctionBegin; 2019e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 20208d0534beSBarry Smith 20218d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2022d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 20238d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 20248d0534beSBarry Smith PetscFunctionReturn(0); 20258d0534beSBarry Smith } 20268d0534beSBarry Smith 20270716a85fSBarry Smith 20280716a85fSBarry Smith #undef __FUNCT__ 20290716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense" 20300716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 20310716a85fSBarry Smith { 20320716a85fSBarry Smith PetscErrorCode ierr; 20330716a85fSBarry Smith PetscInt i,j,m,n; 20340716a85fSBarry Smith PetscScalar *a; 20350716a85fSBarry Smith 20360716a85fSBarry Smith PetscFunctionBegin; 20370716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 20380716a85fSBarry Smith ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); 20398c778c55SBarry Smith ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr); 20400716a85fSBarry Smith if (type == NORM_2) { 20410716a85fSBarry Smith for (i=0; i<n; i++) { 20420716a85fSBarry Smith for (j=0; j<m; j++) { 20430716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 20440716a85fSBarry Smith } 20450716a85fSBarry Smith a += m; 20460716a85fSBarry Smith } 20470716a85fSBarry Smith } else if (type == NORM_1) { 20480716a85fSBarry Smith for (i=0; i<n; i++) { 20490716a85fSBarry Smith for (j=0; j<m; j++) { 20500716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 20510716a85fSBarry Smith } 20520716a85fSBarry Smith a += m; 20530716a85fSBarry Smith } 20540716a85fSBarry Smith } else if (type == NORM_INFINITY) { 20550716a85fSBarry Smith for (i=0; i<n; i++) { 20560716a85fSBarry Smith for (j=0; j<m; j++) { 20570716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 20580716a85fSBarry Smith } 20590716a85fSBarry Smith a += m; 20600716a85fSBarry Smith } 2061ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 20628c778c55SBarry Smith ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr); 20630716a85fSBarry Smith if (type == NORM_2) { 20648f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 20650716a85fSBarry Smith } 20660716a85fSBarry Smith PetscFunctionReturn(0); 20670716a85fSBarry Smith } 20680716a85fSBarry Smith 206973a71a0fSBarry Smith #undef __FUNCT__ 207073a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense" 207173a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 207273a71a0fSBarry Smith { 207373a71a0fSBarry Smith PetscErrorCode ierr; 207473a71a0fSBarry Smith PetscScalar *a; 207573a71a0fSBarry Smith PetscInt m,n,i; 207673a71a0fSBarry Smith 207773a71a0fSBarry Smith PetscFunctionBegin; 207873a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 20798c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 208073a71a0fSBarry Smith for (i=0; i<m*n; i++) { 208173a71a0fSBarry Smith ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr); 208273a71a0fSBarry Smith } 20838c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 208473a71a0fSBarry Smith PetscFunctionReturn(0); 208573a71a0fSBarry Smith } 208673a71a0fSBarry Smith 20873b49f96aSBarry Smith #undef __FUNCT__ 20883b49f96aSBarry Smith #define __FUNCT__ "MatMissingDiagonal_SeqDense" 20893b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool *missing,PetscInt *d) 20903b49f96aSBarry Smith { 20913b49f96aSBarry Smith PetscFunctionBegin; 20923b49f96aSBarry Smith *missing = PETSC_FALSE; 20933b49f96aSBarry Smith PetscFunctionReturn(0); 20943b49f96aSBarry Smith } 209573a71a0fSBarry Smith 2096abc3b08eSStefano Zampini 2097289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2098a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2099905e6a2fSBarry Smith MatGetRow_SeqDense, 2100905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2101905e6a2fSBarry Smith MatMult_SeqDense, 210297304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 21037c922b88SBarry Smith MatMultTranspose_SeqDense, 21047c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2105db4efbfdSBarry Smith 0, 2106db4efbfdSBarry Smith 0, 2107db4efbfdSBarry Smith 0, 2108db4efbfdSBarry Smith /* 10*/ 0, 2109905e6a2fSBarry Smith MatLUFactor_SeqDense, 2110905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 211141f059aeSBarry Smith MatSOR_SeqDense, 2112ec8511deSBarry Smith MatTranspose_SeqDense, 211397304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2114905e6a2fSBarry Smith MatEqual_SeqDense, 2115905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2116905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2117905e6a2fSBarry Smith MatNorm_SeqDense, 2118c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2119c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2120905e6a2fSBarry Smith MatSetOption_SeqDense, 2121905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2122d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2123db4efbfdSBarry Smith 0, 2124db4efbfdSBarry Smith 0, 2125db4efbfdSBarry Smith 0, 2126db4efbfdSBarry Smith 0, 21274994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2128273d9f13SBarry Smith 0, 2129905e6a2fSBarry Smith 0, 213073a71a0fSBarry Smith 0, 213173a71a0fSBarry Smith 0, 2132d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2133a5ae1ecdSBarry Smith 0, 2134a5ae1ecdSBarry Smith 0, 2135a5ae1ecdSBarry Smith 0, 2136a5ae1ecdSBarry Smith 0, 2137d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 2138a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 2139a5ae1ecdSBarry Smith 0, 21404b0e389bSBarry Smith MatGetValues_SeqDense, 2141a5ae1ecdSBarry Smith MatCopy_SeqDense, 2142d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2143a5ae1ecdSBarry Smith MatScale_SeqDense, 21447d68702bSBarry Smith MatShift_Basic, 2145a5ae1ecdSBarry Smith 0, 2146a5ae1ecdSBarry Smith 0, 214773a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2148a5ae1ecdSBarry Smith 0, 2149a5ae1ecdSBarry Smith 0, 2150a5ae1ecdSBarry Smith 0, 2151a5ae1ecdSBarry Smith 0, 2152d519adbfSMatthew Knepley /* 54*/ 0, 2153a5ae1ecdSBarry Smith 0, 2154a5ae1ecdSBarry Smith 0, 2155a5ae1ecdSBarry Smith 0, 2156a5ae1ecdSBarry Smith 0, 2157d519adbfSMatthew Knepley /* 59*/ 0, 2158e03a110bSBarry Smith MatDestroy_SeqDense, 2159e03a110bSBarry Smith MatView_SeqDense, 2160357abbc8SBarry Smith 0, 216197304618SKris Buschelman 0, 2162d519adbfSMatthew Knepley /* 64*/ 0, 216397304618SKris Buschelman 0, 216497304618SKris Buschelman 0, 216597304618SKris Buschelman 0, 216697304618SKris Buschelman 0, 2167d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 216897304618SKris Buschelman 0, 216997304618SKris Buschelman 0, 217097304618SKris Buschelman 0, 217197304618SKris Buschelman 0, 2172d519adbfSMatthew Knepley /* 74*/ 0, 217397304618SKris Buschelman 0, 217497304618SKris Buschelman 0, 217597304618SKris Buschelman 0, 217697304618SKris Buschelman 0, 2177d519adbfSMatthew Knepley /* 79*/ 0, 217897304618SKris Buschelman 0, 217997304618SKris Buschelman 0, 218097304618SKris Buschelman 0, 21815bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2182865e5f61SKris Buschelman 0, 21831cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2184865e5f61SKris Buschelman 0, 2185865e5f61SKris Buschelman 0, 2186865e5f61SKris Buschelman 0, 2187d519adbfSMatthew Knepley /* 89*/ MatMatMult_SeqDense_SeqDense, 2188a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 2189a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2190abc3b08eSStefano Zampini MatPtAP_SeqDense_SeqDense, 2191abc3b08eSStefano Zampini MatPtAPSymbolic_SeqDense_SeqDense, 2192abc3b08eSStefano Zampini /* 94*/ MatPtAPNumeric_SeqDense_SeqDense, 21935df89d91SHong Zhang 0, 21945df89d91SHong Zhang 0, 21955df89d91SHong Zhang 0, 2196284134d9SBarry Smith 0, 2197d519adbfSMatthew Knepley /* 99*/ 0, 2198284134d9SBarry Smith 0, 2199284134d9SBarry Smith 0, 2200ba337c44SJed Brown MatConjugate_SeqDense, 2201f73d5cc4SBarry Smith 0, 2202ba337c44SJed Brown /*104*/ 0, 2203ba337c44SJed Brown MatRealPart_SeqDense, 2204ba337c44SJed Brown MatImaginaryPart_SeqDense, 2205985db425SBarry Smith 0, 2206985db425SBarry Smith 0, 220785e2c93fSHong Zhang /*109*/ MatMatSolve_SeqDense, 2208985db425SBarry Smith 0, 22098d0534beSBarry Smith MatGetRowMin_SeqDense, 2210aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 22113b49f96aSBarry Smith MatMissingDiagonal_SeqDense, 2212aabbc4fbSShri Abhyankar /*114*/ 0, 2213aabbc4fbSShri Abhyankar 0, 2214aabbc4fbSShri Abhyankar 0, 2215aabbc4fbSShri Abhyankar 0, 2216aabbc4fbSShri Abhyankar 0, 2217aabbc4fbSShri Abhyankar /*119*/ 0, 2218aabbc4fbSShri Abhyankar 0, 2219aabbc4fbSShri Abhyankar 0, 22200716a85fSBarry Smith 0, 22210716a85fSBarry Smith 0, 22220716a85fSBarry Smith /*124*/ 0, 22235df89d91SHong Zhang MatGetColumnNorms_SeqDense, 22245df89d91SHong Zhang 0, 22255df89d91SHong Zhang 0, 22265df89d91SHong Zhang 0, 22275df89d91SHong Zhang /*129*/ 0, 222875648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 222975648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 223075648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 22313964eb88SJed Brown 0, 22323964eb88SJed Brown /*134*/ 0, 22333964eb88SJed Brown 0, 22343964eb88SJed Brown 0, 22353964eb88SJed Brown 0, 22363964eb88SJed Brown 0, 22373964eb88SJed Brown /*139*/ 0, 2238f9426fe0SMark Adams 0, 22393964eb88SJed Brown 0 2240985db425SBarry Smith }; 224190ace30eSBarry Smith 22424a2ae208SSatish Balay #undef __FUNCT__ 22434a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 22444b828684SBarry Smith /*@C 2245fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2246d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2247d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2248289bc588SBarry Smith 2249db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2250db81eaa0SLois Curfman McInnes 225120563c6bSBarry Smith Input Parameters: 2252db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 22530c775827SLois Curfman McInnes . m - number of rows 225418f449edSLois Curfman McInnes . n - number of columns 22550298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2256dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 225720563c6bSBarry Smith 225820563c6bSBarry Smith Output Parameter: 225944cd7ae7SLois Curfman McInnes . A - the matrix 226020563c6bSBarry Smith 2261b259b22eSLois Curfman McInnes Notes: 226218f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 226318f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 22640298fd71SBarry Smith set data=NULL. 226518f449edSLois Curfman McInnes 2266027ccd11SLois Curfman McInnes Level: intermediate 2267027ccd11SLois Curfman McInnes 2268dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 2269d65003e9SLois Curfman McInnes 227069b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 227120563c6bSBarry Smith @*/ 22727087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2273289bc588SBarry Smith { 2274dfbe8321SBarry Smith PetscErrorCode ierr; 22753b2fbd54SBarry Smith 22763a40ed3dSBarry Smith PetscFunctionBegin; 2277f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2278f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2279273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2280273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2281273d9f13SBarry Smith PetscFunctionReturn(0); 2282273d9f13SBarry Smith } 2283273d9f13SBarry Smith 22844a2ae208SSatish Balay #undef __FUNCT__ 2285afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 2286273d9f13SBarry Smith /*@C 2287273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2288273d9f13SBarry Smith 2289273d9f13SBarry Smith Collective on MPI_Comm 2290273d9f13SBarry Smith 2291273d9f13SBarry Smith Input Parameters: 22921c4f3114SJed Brown + B - the matrix 22930298fd71SBarry Smith - data - the array (or NULL) 2294273d9f13SBarry Smith 2295273d9f13SBarry Smith Notes: 2296273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2297273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2298284134d9SBarry Smith need not call this routine. 2299273d9f13SBarry Smith 2300273d9f13SBarry Smith Level: intermediate 2301273d9f13SBarry Smith 2302273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2303273d9f13SBarry Smith 230469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2305867c911aSBarry Smith 2306273d9f13SBarry Smith @*/ 23077087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2308273d9f13SBarry Smith { 23094ac538c5SBarry Smith PetscErrorCode ierr; 2310a23d5eceSKris Buschelman 2311a23d5eceSKris Buschelman PetscFunctionBegin; 23124ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2313a23d5eceSKris Buschelman PetscFunctionReturn(0); 2314a23d5eceSKris Buschelman } 2315a23d5eceSKris Buschelman 2316a23d5eceSKris Buschelman #undef __FUNCT__ 2317afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 23187087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2319a23d5eceSKris Buschelman { 2320273d9f13SBarry Smith Mat_SeqDense *b; 2321dfbe8321SBarry Smith PetscErrorCode ierr; 2322273d9f13SBarry Smith 2323273d9f13SBarry Smith PetscFunctionBegin; 2324273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2325a868139aSShri Abhyankar 232634ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 232734ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 232834ef9618SShri Abhyankar 2329273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 233086d161a7SShri Abhyankar b->Mmax = B->rmap->n; 233186d161a7SShri Abhyankar b->Nmax = B->cmap->n; 233286d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 233386d161a7SShri Abhyankar 23349e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 23359e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2336e92229d0SSatish Balay ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr); 23373bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 23382205254eSKarl Rupp 23399e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2340273d9f13SBarry Smith } else { /* user-allocated storage */ 23419e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2342273d9f13SBarry Smith b->v = data; 2343273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2344273d9f13SBarry Smith } 23450450473dSBarry Smith B->assembled = PETSC_TRUE; 2346273d9f13SBarry Smith PetscFunctionReturn(0); 2347273d9f13SBarry Smith } 2348273d9f13SBarry Smith 234965b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 23501b807ce4Svictorle #undef __FUNCT__ 23518baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental" 23528baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 23538baccfbdSHong Zhang { 2354d77f618aSHong Zhang Mat mat_elemental; 2355d77f618aSHong Zhang PetscErrorCode ierr; 2356d77f618aSHong Zhang PetscScalar *array,*v_colwise; 2357d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 2358d77f618aSHong Zhang 23598baccfbdSHong Zhang PetscFunctionBegin; 2360d77f618aSHong Zhang ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr); 2361d77f618aSHong Zhang ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr); 2362d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 2363d77f618aSHong Zhang k = 0; 2364d77f618aSHong Zhang for (j=0; j<N; j++) { 2365d77f618aSHong Zhang cols[j] = j; 2366d77f618aSHong Zhang for (i=0; i<M; i++) { 2367d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 2368d77f618aSHong Zhang } 2369d77f618aSHong Zhang } 2370d77f618aSHong Zhang for (i=0; i<M; i++) { 2371d77f618aSHong Zhang rows[i] = i; 2372d77f618aSHong Zhang } 2373d77f618aSHong Zhang ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr); 2374d77f618aSHong Zhang 2375d77f618aSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr); 2376d77f618aSHong Zhang ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 2377d77f618aSHong Zhang ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr); 2378d77f618aSHong Zhang ierr = MatSetUp(mat_elemental);CHKERRQ(ierr); 2379d77f618aSHong Zhang 2380d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 2381d77f618aSHong Zhang ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr); 2382d77f618aSHong Zhang ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2383d77f618aSHong Zhang ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2384d77f618aSHong Zhang ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr); 2385d77f618aSHong Zhang 2386511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 238728be2f97SBarry Smith ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr); 2388d77f618aSHong Zhang } else { 2389d77f618aSHong Zhang *newmat = mat_elemental; 2390d77f618aSHong Zhang } 23918baccfbdSHong Zhang PetscFunctionReturn(0); 23928baccfbdSHong Zhang } 239365b80a83SHong Zhang #endif 23948baccfbdSHong Zhang 23958baccfbdSHong Zhang #undef __FUNCT__ 23961b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 23971b807ce4Svictorle /*@C 23981b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 23991b807ce4Svictorle 24001b807ce4Svictorle Input parameter: 24011b807ce4Svictorle + A - the matrix 24021b807ce4Svictorle - lda - the leading dimension 24031b807ce4Svictorle 24041b807ce4Svictorle Notes: 2405867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 24061b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 24071b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 24081b807ce4Svictorle 24091b807ce4Svictorle Level: intermediate 24101b807ce4Svictorle 24111b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 24121b807ce4Svictorle 2413284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2414867c911aSBarry Smith 24151b807ce4Svictorle @*/ 24167087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 24171b807ce4Svictorle { 24181b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 241921a2c019SBarry Smith 24201b807ce4Svictorle PetscFunctionBegin; 2421e32f2f54SBarry 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); 24221b807ce4Svictorle b->lda = lda; 242321a2c019SBarry Smith b->changelda = PETSC_FALSE; 242421a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 24251b807ce4Svictorle PetscFunctionReturn(0); 24261b807ce4Svictorle } 24271b807ce4Svictorle 24280bad9183SKris Buschelman /*MC 2429fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 24300bad9183SKris Buschelman 24310bad9183SKris Buschelman Options Database Keys: 24320bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 24330bad9183SKris Buschelman 24340bad9183SKris Buschelman Level: beginner 24350bad9183SKris Buschelman 243689665df3SBarry Smith .seealso: MatCreateSeqDense() 243789665df3SBarry Smith 24380bad9183SKris Buschelman M*/ 24390bad9183SKris Buschelman 24404a2ae208SSatish Balay #undef __FUNCT__ 24414a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 24428cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B) 2443273d9f13SBarry Smith { 2444273d9f13SBarry Smith Mat_SeqDense *b; 2445dfbe8321SBarry Smith PetscErrorCode ierr; 24467c334f02SBarry Smith PetscMPIInt size; 2447273d9f13SBarry Smith 2448273d9f13SBarry Smith PetscFunctionBegin; 2449ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 2450e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 245155659b69SBarry Smith 2452b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 2453549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 245444cd7ae7SLois Curfman McInnes B->data = (void*)b; 245518f449edSLois Curfman McInnes 245644cd7ae7SLois Curfman McInnes b->pivots = 0; 2457273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2458273d9f13SBarry Smith b->v = 0; 245921a2c019SBarry Smith b->changelda = PETSC_FALSE; 24604e220ebcSLois Curfman McInnes 2461bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 2462bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2463bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 24648baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 24658baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 24668baccfbdSHong Zhang #endif 2467bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 2468bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2469bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2470bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2471abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 24723bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 24733bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 24743bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 247517667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 24763a40ed3dSBarry Smith PetscFunctionReturn(0); 2477289bc588SBarry Smith } 2478