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__ 12*3f49a652SStefano Zampini #define __FUNCT__ "MatZeroRowsColumns_SeqDense" 13*3f49a652SStefano Zampini PetscErrorCode MatZeroRowsColumns_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 14*3f49a652SStefano Zampini { 15*3f49a652SStefano Zampini PetscErrorCode ierr; 16*3f49a652SStefano Zampini Mat_SeqDense *l = (Mat_SeqDense*)A->data; 17*3f49a652SStefano Zampini PetscInt m = l->lda, n = A->cmap->n,r = A->rmap->n, i,j; 18*3f49a652SStefano Zampini PetscScalar *slot,*bb; 19*3f49a652SStefano Zampini const PetscScalar *xx; 20*3f49a652SStefano Zampini 21*3f49a652SStefano Zampini PetscFunctionBegin; 22*3f49a652SStefano Zampini #if defined(PETSC_USE_DEBUG) 23*3f49a652SStefano Zampini for (i=0; i<N; i++) { 24*3f49a652SStefano Zampini if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 25*3f49a652SStefano Zampini 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); 26*3f49a652SStefano Zampini if (rows[i] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Col %D requested to be zeroed greater than or equal number of cols %D",rows[i],A->cmap->n); 27*3f49a652SStefano Zampini } 28*3f49a652SStefano Zampini #endif 29*3f49a652SStefano Zampini 30*3f49a652SStefano Zampini /* fix right hand side if needed */ 31*3f49a652SStefano Zampini if (x && b) { 32*3f49a652SStefano Zampini ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 33*3f49a652SStefano Zampini ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 34*3f49a652SStefano Zampini for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 35*3f49a652SStefano Zampini ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 36*3f49a652SStefano Zampini ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 37*3f49a652SStefano Zampini } 38*3f49a652SStefano Zampini 39*3f49a652SStefano Zampini for (i=0; i<N; i++) { 40*3f49a652SStefano Zampini slot = l->v + rows[i]*m; 41*3f49a652SStefano Zampini ierr = PetscMemzero(slot,r*sizeof(PetscScalar));CHKERRQ(ierr); 42*3f49a652SStefano Zampini } 43*3f49a652SStefano Zampini for (i=0; i<N; i++) { 44*3f49a652SStefano Zampini slot = l->v + rows[i]; 45*3f49a652SStefano Zampini for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 46*3f49a652SStefano Zampini } 47*3f49a652SStefano Zampini if (diag != 0.0) { 48*3f49a652SStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 49*3f49a652SStefano Zampini for (i=0; i<N; i++) { 50*3f49a652SStefano Zampini slot = l->v + (m+1)*rows[i]; 51*3f49a652SStefano Zampini *slot = diag; 52*3f49a652SStefano Zampini } 53*3f49a652SStefano Zampini } 54*3f49a652SStefano Zampini PetscFunctionReturn(0); 55*3f49a652SStefano Zampini } 56*3f49a652SStefano Zampini 57*3f49a652SStefano Zampini #undef __FUNCT__ 58abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAPNumeric_SeqDense_SeqDense" 59abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C) 60abc3b08eSStefano Zampini { 61abc3b08eSStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)(C->data); 62abc3b08eSStefano Zampini PetscErrorCode ierr; 63abc3b08eSStefano Zampini 64abc3b08eSStefano Zampini PetscFunctionBegin; 65abc3b08eSStefano Zampini ierr = MatMatMultNumeric_SeqDense_SeqDense(A,P,c->ptapwork);CHKERRQ(ierr); 66abc3b08eSStefano Zampini ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(P,c->ptapwork,C);CHKERRQ(ierr); 67abc3b08eSStefano Zampini PetscFunctionReturn(0); 68abc3b08eSStefano Zampini } 69abc3b08eSStefano Zampini 70abc3b08eSStefano Zampini #undef __FUNCT__ 71abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAPSymbolic_SeqDense_SeqDense" 72abc3b08eSStefano Zampini PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat *C) 73abc3b08eSStefano Zampini { 74abc3b08eSStefano Zampini Mat_SeqDense *c; 75abc3b08eSStefano Zampini PetscErrorCode ierr; 76abc3b08eSStefano Zampini 77abc3b08eSStefano Zampini PetscFunctionBegin; 78abc3b08eSStefano Zampini ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),P->cmap->N,P->cmap->N,NULL,C);CHKERRQ(ierr); 79abc3b08eSStefano Zampini c = (Mat_SeqDense*)((*C)->data); 80abc3b08eSStefano Zampini ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),A->rmap->N,P->cmap->N,NULL,&c->ptapwork);CHKERRQ(ierr); 81abc3b08eSStefano Zampini PetscFunctionReturn(0); 82abc3b08eSStefano Zampini } 83abc3b08eSStefano Zampini 84abc3b08eSStefano Zampini #undef __FUNCT__ 85abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAP_SeqDense_SeqDense" 86abc3b08eSStefano Zampini PETSC_EXTERN PetscErrorCode MatPtAP_SeqDense_SeqDense(Mat A,Mat P,MatReuse reuse,PetscReal fill,Mat *C) 87abc3b08eSStefano Zampini { 88abc3b08eSStefano Zampini PetscErrorCode ierr; 89abc3b08eSStefano Zampini 90abc3b08eSStefano Zampini PetscFunctionBegin; 91abc3b08eSStefano Zampini if (reuse == MAT_INITIAL_MATRIX) { 92abc3b08eSStefano Zampini ierr = MatPtAPSymbolic_SeqDense_SeqDense(A,P,fill,C);CHKERRQ(ierr); 93abc3b08eSStefano Zampini } 94abc3b08eSStefano Zampini ierr = PetscLogEventBegin(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 95abc3b08eSStefano Zampini ierr = (*(*C)->ops->ptapnumeric)(A,P,*C);CHKERRQ(ierr); 96abc3b08eSStefano Zampini ierr = PetscLogEventEnd(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 97abc3b08eSStefano Zampini PetscFunctionReturn(0); 98abc3b08eSStefano Zampini } 99abc3b08eSStefano Zampini 100abc3b08eSStefano Zampini #undef __FUNCT__ 101b49cda9fSStefano Zampini #define __FUNCT__ "MatConvert_SeqAIJ_SeqDense" 102b49cda9fSStefano Zampini PETSC_EXTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat) 103b49cda9fSStefano Zampini { 104b49cda9fSStefano Zampini Mat B; 105b49cda9fSStefano Zampini Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 106b49cda9fSStefano Zampini Mat_SeqDense *b; 107b49cda9fSStefano Zampini PetscErrorCode ierr; 108b49cda9fSStefano Zampini PetscInt *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i; 109b49cda9fSStefano Zampini MatScalar *av=a->a; 110b49cda9fSStefano Zampini 111b49cda9fSStefano Zampini PetscFunctionBegin; 112b49cda9fSStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 113b49cda9fSStefano Zampini ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr); 114b49cda9fSStefano Zampini ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr); 115b49cda9fSStefano Zampini ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr); 116b49cda9fSStefano Zampini 117b49cda9fSStefano Zampini b = (Mat_SeqDense*)(B->data); 118b49cda9fSStefano Zampini for (i=0; i<m; i++) { 119b49cda9fSStefano Zampini PetscInt j; 120b49cda9fSStefano Zampini for (j=0;j<ai[1]-ai[0];j++) { 121b49cda9fSStefano Zampini b->v[*aj*m+i] = *av; 122b49cda9fSStefano Zampini aj++; 123b49cda9fSStefano Zampini av++; 124b49cda9fSStefano Zampini } 125b49cda9fSStefano Zampini ai++; 126b49cda9fSStefano Zampini } 127b49cda9fSStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 128b49cda9fSStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 129b49cda9fSStefano Zampini 130511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 13128be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 132b49cda9fSStefano Zampini } else { 133b49cda9fSStefano Zampini *newmat = B; 134b49cda9fSStefano Zampini } 135b49cda9fSStefano Zampini PetscFunctionReturn(0); 136b49cda9fSStefano Zampini } 137b49cda9fSStefano Zampini 138b49cda9fSStefano Zampini #undef __FUNCT__ 1396a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ" 1408cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 1416a63e612SBarry Smith { 1426a63e612SBarry Smith Mat B; 1436a63e612SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1446a63e612SBarry Smith PetscErrorCode ierr; 1459399e1b8SMatthew G. Knepley PetscInt i, j; 1469399e1b8SMatthew G. Knepley PetscInt *rows, *nnz; 1479399e1b8SMatthew G. Knepley MatScalar *aa = a->v, *vals; 1486a63e612SBarry Smith 1496a63e612SBarry Smith PetscFunctionBegin; 150ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 1516a63e612SBarry Smith ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 1526a63e612SBarry Smith ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr); 1539399e1b8SMatthew G. Knepley ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr); 1549399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 1559399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i]; 1566a63e612SBarry Smith aa += a->lda; 1576a63e612SBarry Smith } 1589399e1b8SMatthew G. Knepley ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr); 1599399e1b8SMatthew G. Knepley aa = a->v; 1609399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 1619399e1b8SMatthew G. Knepley PetscInt numRows = 0; 1629399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];} 1639399e1b8SMatthew G. Knepley ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr); 1649399e1b8SMatthew G. Knepley aa += a->lda; 1659399e1b8SMatthew G. Knepley } 1669399e1b8SMatthew G. Knepley ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr); 1676a63e612SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1686a63e612SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1696a63e612SBarry Smith 170511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 17128be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 1726a63e612SBarry Smith } else { 1736a63e612SBarry Smith *newmat = B; 1746a63e612SBarry Smith } 1756a63e612SBarry Smith PetscFunctionReturn(0); 1766a63e612SBarry Smith } 1776a63e612SBarry Smith 1784a2ae208SSatish Balay #undef __FUNCT__ 1794a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense" 180f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 1811987afe7SBarry Smith { 1821987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 183f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 18413f74950SBarry Smith PetscInt j; 1850805154bSBarry Smith PetscBLASInt N,m,ldax,lday,one = 1; 186efee365bSSatish Balay PetscErrorCode ierr; 1873a40ed3dSBarry Smith 1883a40ed3dSBarry Smith PetscFunctionBegin; 189c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr); 190c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr); 191c5df96a5SBarry Smith ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr); 192c5df96a5SBarry Smith ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr); 193a5ce6ee0Svictorle if (ldax>m || lday>m) { 194d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 1958b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one)); 196a5ce6ee0Svictorle } 197a5ce6ee0Svictorle } else { 1988b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one)); 199a5ce6ee0Svictorle } 200a3fa217bSJose E. Roman ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr); 2010450473dSBarry Smith ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr); 2023a40ed3dSBarry Smith PetscFunctionReturn(0); 2031987afe7SBarry Smith } 2041987afe7SBarry Smith 2054a2ae208SSatish Balay #undef __FUNCT__ 2064a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense" 207dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 208289bc588SBarry Smith { 209d0f46423SBarry Smith PetscInt N = A->rmap->n*A->cmap->n; 2103a40ed3dSBarry Smith 2113a40ed3dSBarry Smith PetscFunctionBegin; 2124e220ebcSLois Curfman McInnes info->block_size = 1.0; 2134e220ebcSLois Curfman McInnes info->nz_allocated = (double)N; 2146de62eeeSBarry Smith info->nz_used = (double)N; 2156de62eeeSBarry Smith info->nz_unneeded = (double)0; 2164e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 2174e220ebcSLois Curfman McInnes info->mallocs = 0; 2187adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 2194e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 2204e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 2214e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 2223a40ed3dSBarry Smith PetscFunctionReturn(0); 223289bc588SBarry Smith } 224289bc588SBarry Smith 2254a2ae208SSatish Balay #undef __FUNCT__ 2264a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense" 227f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 22880cd9d93SLois Curfman McInnes { 229273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 230f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 231efee365bSSatish Balay PetscErrorCode ierr; 232c5df96a5SBarry Smith PetscBLASInt one = 1,j,nz,lda; 23380cd9d93SLois Curfman McInnes 2343a40ed3dSBarry Smith PetscFunctionBegin; 235c5df96a5SBarry Smith ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr); 236d0f46423SBarry Smith if (lda>A->rmap->n) { 237c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr); 238d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 2398b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one)); 240a5ce6ee0Svictorle } 241a5ce6ee0Svictorle } else { 242c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr); 2438b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one)); 244a5ce6ee0Svictorle } 245efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 2463a40ed3dSBarry Smith PetscFunctionReturn(0); 24780cd9d93SLois Curfman McInnes } 24880cd9d93SLois Curfman McInnes 2491cbb95d3SBarry Smith #undef __FUNCT__ 2501cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense" 251ace3abfcSBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 2521cbb95d3SBarry Smith { 2531cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 254d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,N; 2551cbb95d3SBarry Smith PetscScalar *v = a->v; 2561cbb95d3SBarry Smith 2571cbb95d3SBarry Smith PetscFunctionBegin; 2581cbb95d3SBarry Smith *fl = PETSC_FALSE; 259d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 2601cbb95d3SBarry Smith N = a->lda; 2611cbb95d3SBarry Smith 2621cbb95d3SBarry Smith for (i=0; i<m; i++) { 2631cbb95d3SBarry Smith for (j=i+1; j<m; j++) { 2641cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 2651cbb95d3SBarry Smith } 2661cbb95d3SBarry Smith } 2671cbb95d3SBarry Smith *fl = PETSC_TRUE; 2681cbb95d3SBarry Smith PetscFunctionReturn(0); 2691cbb95d3SBarry Smith } 2701cbb95d3SBarry Smith 271b24902e0SBarry Smith #undef __FUNCT__ 272b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense" 273719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 274b24902e0SBarry Smith { 275b24902e0SBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 276b24902e0SBarry Smith PetscErrorCode ierr; 277b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 278b24902e0SBarry Smith 279b24902e0SBarry Smith PetscFunctionBegin; 280aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr); 281aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr); 2820298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr); 283b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 284b24902e0SBarry Smith l = (Mat_SeqDense*)newi->data; 285d0f46423SBarry Smith if (lda>A->rmap->n) { 286d0f46423SBarry Smith m = A->rmap->n; 287d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 288b24902e0SBarry Smith ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 289b24902e0SBarry Smith } 290b24902e0SBarry Smith } else { 291d0f46423SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 292b24902e0SBarry Smith } 293b24902e0SBarry Smith } 294b24902e0SBarry Smith newi->assembled = PETSC_TRUE; 295b24902e0SBarry Smith PetscFunctionReturn(0); 296b24902e0SBarry Smith } 297b24902e0SBarry Smith 2984a2ae208SSatish Balay #undef __FUNCT__ 2994a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense" 300dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 30102cad45dSBarry Smith { 3026849ba73SBarry Smith PetscErrorCode ierr; 30302cad45dSBarry Smith 3043a40ed3dSBarry Smith PetscFunctionBegin; 305ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr); 306d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 3075c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 308719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 309b24902e0SBarry Smith PetscFunctionReturn(0); 310b24902e0SBarry Smith } 311b24902e0SBarry Smith 3126ee01492SSatish Balay 3130481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*); 314719d5645SBarry Smith 3154a2ae208SSatish Balay #undef __FUNCT__ 3164a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense" 3170481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 318289bc588SBarry Smith { 3194482741eSBarry Smith MatFactorInfo info; 320a093e273SMatthew Knepley PetscErrorCode ierr; 3213a40ed3dSBarry Smith 3223a40ed3dSBarry Smith PetscFunctionBegin; 323c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 324719d5645SBarry Smith ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr); 3253a40ed3dSBarry Smith PetscFunctionReturn(0); 326289bc588SBarry Smith } 3276ee01492SSatish Balay 3280b4b3355SBarry Smith #undef __FUNCT__ 3294a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense" 330dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 331289bc588SBarry Smith { 332c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 3336849ba73SBarry Smith PetscErrorCode ierr; 334f1ceaac6SMatthew G. Knepley const PetscScalar *x; 335f1ceaac6SMatthew G. Knepley PetscScalar *y; 336c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 33767e560aaSBarry Smith 3383a40ed3dSBarry Smith PetscFunctionBegin; 339c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 340f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 3411ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 342d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 343d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 344ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 345e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 346ae7cfcebSSatish Balay #else 3478b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 348e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 349ae7cfcebSSatish Balay #endif 350d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 351ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 352e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 353ae7cfcebSSatish Balay #else 3548b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 355e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 356ae7cfcebSSatish Balay #endif 3572205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 358f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 3591ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 360dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 3613a40ed3dSBarry Smith PetscFunctionReturn(0); 362289bc588SBarry Smith } 3636ee01492SSatish Balay 3644a2ae208SSatish Balay #undef __FUNCT__ 36585e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense" 36685e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 36785e2c93fSHong Zhang { 36885e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 36985e2c93fSHong Zhang PetscErrorCode ierr; 37085e2c93fSHong Zhang PetscScalar *b,*x; 371efb80c78SLisandro Dalcin PetscInt n; 372783b601eSJed Brown PetscBLASInt nrhs,info,m; 373bda8bf91SBarry Smith PetscBool flg; 37485e2c93fSHong Zhang 37585e2c93fSHong Zhang PetscFunctionBegin; 376c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 3770298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 378ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix"); 3790298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 380ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix"); 381bda8bf91SBarry Smith 3820298fd71SBarry Smith ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr); 383c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr); 3848c778c55SBarry Smith ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr); 3858c778c55SBarry Smith ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr); 38685e2c93fSHong Zhang 387f272c775SHong Zhang ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr); 38885e2c93fSHong Zhang 38985e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 39085e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS) 39185e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 39285e2c93fSHong Zhang #else 3938b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 39485e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 39585e2c93fSHong Zhang #endif 39685e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 39785e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS) 39885e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 39985e2c93fSHong Zhang #else 4008b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info)); 40185e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 40285e2c93fSHong Zhang #endif 4032205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 40485e2c93fSHong Zhang 4058c778c55SBarry Smith ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr); 4068c778c55SBarry Smith ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr); 40785e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 40885e2c93fSHong Zhang PetscFunctionReturn(0); 40985e2c93fSHong Zhang } 41085e2c93fSHong Zhang 41185e2c93fSHong Zhang #undef __FUNCT__ 4124a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense" 413dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 414da3a660dSBarry Smith { 415c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 416dfbe8321SBarry Smith PetscErrorCode ierr; 417f1ceaac6SMatthew G. Knepley const PetscScalar *x; 418f1ceaac6SMatthew G. Knepley PetscScalar *y; 419c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 42067e560aaSBarry Smith 4213a40ed3dSBarry Smith PetscFunctionBegin; 422c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 423f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4241ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 425d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 426752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 427da3a660dSBarry Smith if (mat->pivots) { 428ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 429e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 430ae7cfcebSSatish Balay #else 4318b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 432e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 433ae7cfcebSSatish Balay #endif 4347a97a34bSBarry Smith } else { 435ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 436e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 437ae7cfcebSSatish Balay #else 4388b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 439e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 440ae7cfcebSSatish Balay #endif 441da3a660dSBarry Smith } 442f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4431ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 444dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 4453a40ed3dSBarry Smith PetscFunctionReturn(0); 446da3a660dSBarry Smith } 4476ee01492SSatish Balay 4484a2ae208SSatish Balay #undef __FUNCT__ 4494a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense" 450dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 451da3a660dSBarry Smith { 452c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 453dfbe8321SBarry Smith PetscErrorCode ierr; 454f1ceaac6SMatthew G. Knepley const PetscScalar *x; 455f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 456da3a660dSBarry Smith Vec tmp = 0; 457c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 45867e560aaSBarry Smith 4593a40ed3dSBarry Smith PetscFunctionBegin; 460c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 461f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4621ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 463d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 464da3a660dSBarry Smith if (yy == zz) { 46578b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 4663bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 46778b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 468da3a660dSBarry Smith } 469d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 470752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 471da3a660dSBarry Smith if (mat->pivots) { 472ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 473e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 474ae7cfcebSSatish Balay #else 4758b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 476e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 477ae7cfcebSSatish Balay #endif 478a8c6a408SBarry Smith } else { 479ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 480e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 481ae7cfcebSSatish Balay #else 4828b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 483e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 484ae7cfcebSSatish Balay #endif 485da3a660dSBarry Smith } 4866bf464f9SBarry Smith if (tmp) { 4876bf464f9SBarry Smith ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 4886bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 4896bf464f9SBarry Smith } else { 4906bf464f9SBarry Smith ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 4916bf464f9SBarry Smith } 492f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4931ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 494dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 4953a40ed3dSBarry Smith PetscFunctionReturn(0); 496da3a660dSBarry Smith } 49767e560aaSBarry Smith 4984a2ae208SSatish Balay #undef __FUNCT__ 4994a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense" 500dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 501da3a660dSBarry Smith { 502c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 5036849ba73SBarry Smith PetscErrorCode ierr; 504f1ceaac6SMatthew G. Knepley const PetscScalar *x; 505f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 506da3a660dSBarry Smith Vec tmp; 507c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 50867e560aaSBarry Smith 5093a40ed3dSBarry Smith PetscFunctionBegin; 510c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 511d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 512f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 5131ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 514da3a660dSBarry Smith if (yy == zz) { 51578b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 5163bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 51778b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 518da3a660dSBarry Smith } 519d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 520752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 521da3a660dSBarry Smith if (mat->pivots) { 522ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 523e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 524ae7cfcebSSatish Balay #else 5258b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 526e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 527ae7cfcebSSatish Balay #endif 5283a40ed3dSBarry Smith } else { 529ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 530e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 531ae7cfcebSSatish Balay #else 5328b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 533e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 534ae7cfcebSSatish Balay #endif 535da3a660dSBarry Smith } 53690f02eecSBarry Smith if (tmp) { 5372dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 5386bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 5393a40ed3dSBarry Smith } else { 5402dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 54190f02eecSBarry Smith } 542f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 5431ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 544dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 5453a40ed3dSBarry Smith PetscFunctionReturn(0); 546da3a660dSBarry Smith } 547db4efbfdSBarry Smith 548db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 549db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 550db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 551db4efbfdSBarry Smith #undef __FUNCT__ 552db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense" 5530481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 554db4efbfdSBarry Smith { 555db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 556db4efbfdSBarry Smith PetscFunctionBegin; 557e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 558db4efbfdSBarry Smith #else 559db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 560db4efbfdSBarry Smith PetscErrorCode ierr; 561db4efbfdSBarry Smith PetscBLASInt n,m,info; 562db4efbfdSBarry Smith 563db4efbfdSBarry Smith PetscFunctionBegin; 564c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 565c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 566db4efbfdSBarry Smith if (!mat->pivots) { 567854ce69bSBarry Smith ierr = PetscMalloc1(A->rmap->n+1,&mat->pivots);CHKERRQ(ierr); 5683bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 569db4efbfdSBarry Smith } 570db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5718e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5728b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info)); 5738e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 5748e57ea43SSatish Balay 575e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 576e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 577db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 578db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 579db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 580db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 581d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 582db4efbfdSBarry Smith 583dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 584db4efbfdSBarry Smith #endif 585db4efbfdSBarry Smith PetscFunctionReturn(0); 586db4efbfdSBarry Smith } 587db4efbfdSBarry Smith 588db4efbfdSBarry Smith #undef __FUNCT__ 589db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense" 5900481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 591db4efbfdSBarry Smith { 592db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 593db4efbfdSBarry Smith PetscFunctionBegin; 594e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 595db4efbfdSBarry Smith #else 596db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 597db4efbfdSBarry Smith PetscErrorCode ierr; 598c5df96a5SBarry Smith PetscBLASInt info,n; 599db4efbfdSBarry Smith 600db4efbfdSBarry Smith PetscFunctionBegin; 601c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 602db4efbfdSBarry Smith ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 603db4efbfdSBarry Smith 604db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 6058b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info)); 606e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 607db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 608db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 609db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 610db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 611d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 6122205254eSKarl Rupp 613eb3f19e4SBarry Smith ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 614db4efbfdSBarry Smith #endif 615db4efbfdSBarry Smith PetscFunctionReturn(0); 616db4efbfdSBarry Smith } 617db4efbfdSBarry Smith 618db4efbfdSBarry Smith 619db4efbfdSBarry Smith #undef __FUNCT__ 620db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense" 6210481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 622db4efbfdSBarry Smith { 623db4efbfdSBarry Smith PetscErrorCode ierr; 624db4efbfdSBarry Smith MatFactorInfo info; 625db4efbfdSBarry Smith 626db4efbfdSBarry Smith PetscFunctionBegin; 627db4efbfdSBarry Smith info.fill = 1.0; 6282205254eSKarl Rupp 629c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 630719d5645SBarry Smith ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr); 631db4efbfdSBarry Smith PetscFunctionReturn(0); 632db4efbfdSBarry Smith } 633db4efbfdSBarry Smith 634db4efbfdSBarry Smith #undef __FUNCT__ 635db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense" 6360481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 637db4efbfdSBarry Smith { 638db4efbfdSBarry Smith PetscFunctionBegin; 639c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 6401bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 641719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 642db4efbfdSBarry Smith PetscFunctionReturn(0); 643db4efbfdSBarry Smith } 644db4efbfdSBarry Smith 645db4efbfdSBarry Smith #undef __FUNCT__ 646db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense" 6470481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 648db4efbfdSBarry Smith { 649db4efbfdSBarry Smith PetscFunctionBegin; 650b66fe19dSMatthew G Knepley fact->preallocated = PETSC_TRUE; 651c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 652719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 653db4efbfdSBarry Smith PetscFunctionReturn(0); 654db4efbfdSBarry Smith } 655db4efbfdSBarry Smith 656db4efbfdSBarry Smith #undef __FUNCT__ 657db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc" 6588cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 659db4efbfdSBarry Smith { 660db4efbfdSBarry Smith PetscErrorCode ierr; 661db4efbfdSBarry Smith 662db4efbfdSBarry Smith PetscFunctionBegin; 663ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr); 664db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 665db4efbfdSBarry Smith ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr); 666db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU) { 667db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 668db4efbfdSBarry Smith } else { 669db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 670db4efbfdSBarry Smith } 671d5f3da31SBarry Smith (*fact)->factortype = ftype; 672db4efbfdSBarry Smith PetscFunctionReturn(0); 673db4efbfdSBarry Smith } 674db4efbfdSBarry Smith 675289bc588SBarry Smith /* ------------------------------------------------------------------*/ 6764a2ae208SSatish Balay #undef __FUNCT__ 67741f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense" 67841f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 679289bc588SBarry Smith { 680c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 681d9ca1df4SBarry Smith PetscScalar *x,*v = mat->v,zero = 0.0,xt; 682d9ca1df4SBarry Smith const PetscScalar *b; 683dfbe8321SBarry Smith PetscErrorCode ierr; 684d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 685c5df96a5SBarry Smith PetscBLASInt o = 1,bm; 686289bc588SBarry Smith 6873a40ed3dSBarry Smith PetscFunctionBegin; 688422a814eSBarry Smith if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */ 689c5df96a5SBarry Smith ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr); 690289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 69171044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 6922dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 693289bc588SBarry Smith } 6941ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 695d9ca1df4SBarry Smith ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr); 696b965ef7fSBarry Smith its = its*lits; 697e32f2f54SBarry 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); 698289bc588SBarry Smith while (its--) { 699fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 700289bc588SBarry Smith for (i=0; i<m; i++) { 7018b83055fSJed Brown PetscStackCallBLAS("BLASdot",xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o)); 70255a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 703289bc588SBarry Smith } 704289bc588SBarry Smith } 705fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 706289bc588SBarry Smith for (i=m-1; i>=0; i--) { 7078b83055fSJed Brown PetscStackCallBLAS("BLASdot",xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o)); 70855a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 709289bc588SBarry Smith } 710289bc588SBarry Smith } 711289bc588SBarry Smith } 712d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr); 7131ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 7143a40ed3dSBarry Smith PetscFunctionReturn(0); 715289bc588SBarry Smith } 716289bc588SBarry Smith 717289bc588SBarry Smith /* -----------------------------------------------------------------*/ 7184a2ae208SSatish Balay #undef __FUNCT__ 7194a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense" 720dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 721289bc588SBarry Smith { 722c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 723d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 724d9ca1df4SBarry Smith PetscScalar *y; 725dfbe8321SBarry Smith PetscErrorCode ierr; 7260805154bSBarry Smith PetscBLASInt m, n,_One=1; 727ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 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); 733d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 7341ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 7358b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One)); 736d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 7371ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 738dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 7393a40ed3dSBarry Smith PetscFunctionReturn(0); 740289bc588SBarry Smith } 741800995b7SMatthew Knepley 7424a2ae208SSatish Balay #undef __FUNCT__ 7434a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense" 744dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 745289bc588SBarry Smith { 746c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 747d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0,_DZero=0.0; 748dfbe8321SBarry Smith PetscErrorCode ierr; 7490805154bSBarry Smith PetscBLASInt m, n, _One=1; 750d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 7513a40ed3dSBarry Smith 7523a40ed3dSBarry Smith PetscFunctionBegin; 753c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 754c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 755d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 756d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 7571ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 7588b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One)); 759d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 7601ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 761dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 7623a40ed3dSBarry Smith PetscFunctionReturn(0); 763289bc588SBarry Smith } 7646ee01492SSatish Balay 7654a2ae208SSatish Balay #undef __FUNCT__ 7664a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense" 767dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 768289bc588SBarry Smith { 769c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 770d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 771d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0; 772dfbe8321SBarry Smith PetscErrorCode ierr; 7730805154bSBarry Smith PetscBLASInt m, n, _One=1; 7743a40ed3dSBarry Smith 7753a40ed3dSBarry Smith PetscFunctionBegin; 776c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 777c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 778d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 779600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 780d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 7811ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 7828b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 783d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 7841ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 785dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 7863a40ed3dSBarry Smith PetscFunctionReturn(0); 787289bc588SBarry Smith } 7886ee01492SSatish Balay 7894a2ae208SSatish Balay #undef __FUNCT__ 7904a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense" 791dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 792289bc588SBarry Smith { 793c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 794d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 795d9ca1df4SBarry Smith PetscScalar *y; 796dfbe8321SBarry Smith PetscErrorCode ierr; 7970805154bSBarry Smith PetscBLASInt m, n, _One=1; 79887828ca2SBarry Smith PetscScalar _DOne=1.0; 7993a40ed3dSBarry Smith 8003a40ed3dSBarry Smith PetscFunctionBegin; 801c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 802c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 803d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 804600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 805d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8061ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 8078b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 808d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8091ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 810dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 8113a40ed3dSBarry Smith PetscFunctionReturn(0); 812289bc588SBarry Smith } 813289bc588SBarry Smith 814289bc588SBarry Smith /* -----------------------------------------------------------------*/ 8154a2ae208SSatish Balay #undef __FUNCT__ 8164a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense" 81713f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 818289bc588SBarry Smith { 819c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 82087828ca2SBarry Smith PetscScalar *v; 8216849ba73SBarry Smith PetscErrorCode ierr; 82213f74950SBarry Smith PetscInt i; 82367e560aaSBarry Smith 8243a40ed3dSBarry Smith PetscFunctionBegin; 825d0f46423SBarry Smith *ncols = A->cmap->n; 826289bc588SBarry Smith if (cols) { 827854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr); 828d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 829289bc588SBarry Smith } 830289bc588SBarry Smith if (vals) { 831854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr); 832289bc588SBarry Smith v = mat->v + row; 833d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 834289bc588SBarry Smith } 8353a40ed3dSBarry Smith PetscFunctionReturn(0); 836289bc588SBarry Smith } 8376ee01492SSatish Balay 8384a2ae208SSatish Balay #undef __FUNCT__ 8394a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense" 84013f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 841289bc588SBarry Smith { 842dfbe8321SBarry Smith PetscErrorCode ierr; 8436e111a19SKarl Rupp 844606d414cSSatish Balay PetscFunctionBegin; 845606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 846606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 8473a40ed3dSBarry Smith PetscFunctionReturn(0); 848289bc588SBarry Smith } 849289bc588SBarry Smith /* ----------------------------------------------------------------*/ 8504a2ae208SSatish Balay #undef __FUNCT__ 8514a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense" 85213f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 853289bc588SBarry Smith { 854c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 85513f74950SBarry Smith PetscInt i,j,idx=0; 856d6dfbf8fSBarry Smith 8573a40ed3dSBarry Smith PetscFunctionBegin; 858289bc588SBarry Smith if (!mat->roworiented) { 859dbb450caSBarry Smith if (addv == INSERT_VALUES) { 860289bc588SBarry Smith for (j=0; j<n; j++) { 861cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 8622515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 863e32f2f54SBarry 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); 86458804f6dSBarry Smith #endif 865289bc588SBarry Smith for (i=0; i<m; i++) { 866cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 8672515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 868e32f2f54SBarry 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); 86958804f6dSBarry Smith #endif 870cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 871289bc588SBarry Smith } 872289bc588SBarry Smith } 8733a40ed3dSBarry Smith } else { 874289bc588SBarry Smith for (j=0; j<n; j++) { 875cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 8762515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 877e32f2f54SBarry 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); 87858804f6dSBarry Smith #endif 879289bc588SBarry Smith for (i=0; i<m; i++) { 880cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 8812515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 882e32f2f54SBarry 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); 88358804f6dSBarry Smith #endif 884cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 885289bc588SBarry Smith } 886289bc588SBarry Smith } 887289bc588SBarry Smith } 8883a40ed3dSBarry Smith } else { 889dbb450caSBarry Smith if (addv == INSERT_VALUES) { 890e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 891cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 8922515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 893e32f2f54SBarry 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); 89458804f6dSBarry Smith #endif 895e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 896cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 8972515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 898e32f2f54SBarry 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); 89958804f6dSBarry Smith #endif 900cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 901e8d4e0b9SBarry Smith } 902e8d4e0b9SBarry Smith } 9033a40ed3dSBarry Smith } else { 904289bc588SBarry Smith for (i=0; i<m; i++) { 905cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 9062515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 907e32f2f54SBarry 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); 90858804f6dSBarry Smith #endif 909289bc588SBarry Smith for (j=0; j<n; j++) { 910cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 9112515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 912e32f2f54SBarry 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); 91358804f6dSBarry Smith #endif 914cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 915289bc588SBarry Smith } 916289bc588SBarry Smith } 917289bc588SBarry Smith } 918e8d4e0b9SBarry Smith } 9193a40ed3dSBarry Smith PetscFunctionReturn(0); 920289bc588SBarry Smith } 921e8d4e0b9SBarry Smith 9224a2ae208SSatish Balay #undef __FUNCT__ 9234a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense" 92413f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 925ae80bb75SLois Curfman McInnes { 926ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 92713f74950SBarry Smith PetscInt i,j; 928ae80bb75SLois Curfman McInnes 9293a40ed3dSBarry Smith PetscFunctionBegin; 930ae80bb75SLois Curfman McInnes /* row-oriented output */ 931ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 93297e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 933e32f2f54SBarry 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); 934ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 9356f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 936e32f2f54SBarry 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); 93797e567efSBarry Smith *v++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 938ae80bb75SLois Curfman McInnes } 939ae80bb75SLois Curfman McInnes } 9403a40ed3dSBarry Smith PetscFunctionReturn(0); 941ae80bb75SLois Curfman McInnes } 942ae80bb75SLois Curfman McInnes 943289bc588SBarry Smith /* -----------------------------------------------------------------*/ 944289bc588SBarry Smith 9454a2ae208SSatish Balay #undef __FUNCT__ 9465bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense" 947112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer) 948aabbc4fbSShri Abhyankar { 949aabbc4fbSShri Abhyankar Mat_SeqDense *a; 950aabbc4fbSShri Abhyankar PetscErrorCode ierr; 951aabbc4fbSShri Abhyankar PetscInt *scols,i,j,nz,header[4]; 952aabbc4fbSShri Abhyankar int fd; 953aabbc4fbSShri Abhyankar PetscMPIInt size; 954aabbc4fbSShri Abhyankar PetscInt *rowlengths = 0,M,N,*cols,grows,gcols; 955aabbc4fbSShri Abhyankar PetscScalar *vals,*svals,*v,*w; 956ce94432eSBarry Smith MPI_Comm comm; 957aabbc4fbSShri Abhyankar 958aabbc4fbSShri Abhyankar PetscFunctionBegin; 959c98fd787SBarry Smith /* force binary viewer to load .info file if it has not yet done so */ 960c98fd787SBarry Smith ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 961ce94432eSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 962aabbc4fbSShri Abhyankar ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 963aabbc4fbSShri Abhyankar if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor"); 964aabbc4fbSShri Abhyankar ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 965aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 966aabbc4fbSShri Abhyankar if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 967aabbc4fbSShri Abhyankar M = header[1]; N = header[2]; nz = header[3]; 968aabbc4fbSShri Abhyankar 969aabbc4fbSShri Abhyankar /* set global size if not set already*/ 970aabbc4fbSShri Abhyankar if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) { 971aabbc4fbSShri Abhyankar ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr); 972aabbc4fbSShri Abhyankar } else { 973aabbc4fbSShri Abhyankar /* if sizes and type are already set, check if the vector global sizes are correct */ 974aabbc4fbSShri Abhyankar ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr); 975aabbc4fbSShri 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); 976aabbc4fbSShri Abhyankar } 977e6324fbbSBarry Smith a = (Mat_SeqDense*)newmat->data; 978e6324fbbSBarry Smith if (!a->user_alloc) { 9790298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 980e6324fbbSBarry Smith } 981aabbc4fbSShri Abhyankar 982aabbc4fbSShri Abhyankar if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 983aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 984aabbc4fbSShri Abhyankar v = a->v; 985aabbc4fbSShri Abhyankar /* Allocate some temp space to read in the values and then flip them 986aabbc4fbSShri Abhyankar from row major to column major */ 987854ce69bSBarry Smith ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr); 988aabbc4fbSShri Abhyankar /* read in nonzero values */ 989aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 990aabbc4fbSShri Abhyankar /* now flip the values and store them in the matrix*/ 991aabbc4fbSShri Abhyankar for (j=0; j<N; j++) { 992aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 993aabbc4fbSShri Abhyankar *v++ =w[i*N+j]; 994aabbc4fbSShri Abhyankar } 995aabbc4fbSShri Abhyankar } 996aabbc4fbSShri Abhyankar ierr = PetscFree(w);CHKERRQ(ierr); 997aabbc4fbSShri Abhyankar } else { 998aabbc4fbSShri Abhyankar /* read row lengths */ 999854ce69bSBarry Smith ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr); 1000aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 1001aabbc4fbSShri Abhyankar 1002aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 1003aabbc4fbSShri Abhyankar v = a->v; 1004aabbc4fbSShri Abhyankar 1005aabbc4fbSShri Abhyankar /* read column indices and nonzeros */ 1006854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr); 1007aabbc4fbSShri Abhyankar cols = scols; 1008aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 1009854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr); 1010aabbc4fbSShri Abhyankar vals = svals; 1011aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 1012aabbc4fbSShri Abhyankar 1013aabbc4fbSShri Abhyankar /* insert into matrix */ 1014aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 1015aabbc4fbSShri Abhyankar for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 1016aabbc4fbSShri Abhyankar svals += rowlengths[i]; scols += rowlengths[i]; 1017aabbc4fbSShri Abhyankar } 1018aabbc4fbSShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1019aabbc4fbSShri Abhyankar ierr = PetscFree(cols);CHKERRQ(ierr); 1020aabbc4fbSShri Abhyankar ierr = PetscFree(rowlengths);CHKERRQ(ierr); 1021aabbc4fbSShri Abhyankar } 1022aabbc4fbSShri Abhyankar ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1023aabbc4fbSShri Abhyankar ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1024aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 1025aabbc4fbSShri Abhyankar } 1026aabbc4fbSShri Abhyankar 1027aabbc4fbSShri Abhyankar #undef __FUNCT__ 10284a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII" 10296849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 1030289bc588SBarry Smith { 1031932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1032dfbe8321SBarry Smith PetscErrorCode ierr; 103313f74950SBarry Smith PetscInt i,j; 10342dcb1b2aSMatthew Knepley const char *name; 103587828ca2SBarry Smith PetscScalar *v; 1036f3ef73ceSBarry Smith PetscViewerFormat format; 10375f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 1038ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 10395f481a85SSatish Balay #endif 1040932b0c3eSLois Curfman McInnes 10413a40ed3dSBarry Smith PetscFunctionBegin; 1042b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1043456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 10443a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 1045fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 1046d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1047d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 104844cd7ae7SLois Curfman McInnes v = a->v + i; 104977431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 1050d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1051aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1052329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 105357622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 1054329f5518SBarry Smith } else if (PetscRealPart(*v)) { 105557622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr); 10566831982aSBarry Smith } 105780cd9d93SLois Curfman McInnes #else 10586831982aSBarry Smith if (*v) { 105957622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr); 10606831982aSBarry Smith } 106180cd9d93SLois Curfman McInnes #endif 10621b807ce4Svictorle v += a->lda; 106380cd9d93SLois Curfman McInnes } 1064b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 106580cd9d93SLois Curfman McInnes } 1066d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 10673a40ed3dSBarry Smith } else { 1068d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1069aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 107047989497SBarry Smith /* determine if matrix has all real values */ 107147989497SBarry Smith v = a->v; 1072d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 1073ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;} 107447989497SBarry Smith } 107547989497SBarry Smith #endif 1076fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 10773a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 1078d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1079d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1080fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 1081ffac6cdbSBarry Smith } 1082ffac6cdbSBarry Smith 1083d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1084932b0c3eSLois Curfman McInnes v = a->v + i; 1085d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1086aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 108747989497SBarry Smith if (allreal) { 1088c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr); 108947989497SBarry Smith } else { 1090c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 109147989497SBarry Smith } 1092289bc588SBarry Smith #else 1093c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr); 1094289bc588SBarry Smith #endif 10951b807ce4Svictorle v += a->lda; 1096289bc588SBarry Smith } 1097b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 1098289bc588SBarry Smith } 1099fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 1100b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 1101ffac6cdbSBarry Smith } 1102d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 1103da3a660dSBarry Smith } 1104b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 11053a40ed3dSBarry Smith PetscFunctionReturn(0); 1106289bc588SBarry Smith } 1107289bc588SBarry Smith 11084a2ae208SSatish Balay #undef __FUNCT__ 11094a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary" 11106849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 1111932b0c3eSLois Curfman McInnes { 1112932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 11136849ba73SBarry Smith PetscErrorCode ierr; 111413f74950SBarry Smith int fd; 1115d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 1116f4403165SShri Abhyankar PetscScalar *v,*anonz,*vals; 1117f4403165SShri Abhyankar PetscViewerFormat format; 1118932b0c3eSLois Curfman McInnes 11193a40ed3dSBarry Smith PetscFunctionBegin; 1120b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 112190ace30eSBarry Smith 1122f4403165SShri Abhyankar ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1123f4403165SShri Abhyankar if (format == PETSC_VIEWER_NATIVE) { 1124f4403165SShri Abhyankar /* store the matrix as a dense matrix */ 1125785e854fSJed Brown ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr); 11262205254eSKarl Rupp 1127f4403165SShri Abhyankar col_lens[0] = MAT_FILE_CLASSID; 1128f4403165SShri Abhyankar col_lens[1] = m; 1129f4403165SShri Abhyankar col_lens[2] = n; 1130f4403165SShri Abhyankar col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 11312205254eSKarl Rupp 1132f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1133f4403165SShri Abhyankar ierr = PetscFree(col_lens);CHKERRQ(ierr); 1134f4403165SShri Abhyankar 1135f4403165SShri Abhyankar /* write out matrix, by rows */ 1136854ce69bSBarry Smith ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr); 1137f4403165SShri Abhyankar v = a->v; 1138f4403165SShri Abhyankar for (j=0; j<n; j++) { 1139f4403165SShri Abhyankar for (i=0; i<m; i++) { 1140f4403165SShri Abhyankar vals[j + i*n] = *v++; 1141f4403165SShri Abhyankar } 1142f4403165SShri Abhyankar } 1143f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1144f4403165SShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1145f4403165SShri Abhyankar } else { 1146854ce69bSBarry Smith ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr); 11472205254eSKarl Rupp 11480700a824SBarry Smith col_lens[0] = MAT_FILE_CLASSID; 1149932b0c3eSLois Curfman McInnes col_lens[1] = m; 1150932b0c3eSLois Curfman McInnes col_lens[2] = n; 1151932b0c3eSLois Curfman McInnes col_lens[3] = nz; 1152932b0c3eSLois Curfman McInnes 1153932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 1154932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 11556f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1156932b0c3eSLois Curfman McInnes 1157932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 1158932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 1159932b0c3eSLois Curfman McInnes ict = 0; 1160932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1161932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 1162932b0c3eSLois Curfman McInnes } 11636f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 1164606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 1165932b0c3eSLois Curfman McInnes 1166932b0c3eSLois Curfman McInnes /* store nonzero values */ 1167854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr); 1168932b0c3eSLois Curfman McInnes ict = 0; 1169932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1170932b0c3eSLois Curfman McInnes v = a->v + i; 1171932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 11721b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 1173932b0c3eSLois Curfman McInnes } 1174932b0c3eSLois Curfman McInnes } 11756f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1176606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 1177f4403165SShri Abhyankar } 11783a40ed3dSBarry Smith PetscFunctionReturn(0); 1179932b0c3eSLois Curfman McInnes } 1180932b0c3eSLois Curfman McInnes 11819804daf3SBarry Smith #include <petscdraw.h> 11824a2ae208SSatish Balay #undef __FUNCT__ 11834a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom" 1184dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1185f1af5d2fSBarry Smith { 1186f1af5d2fSBarry Smith Mat A = (Mat) Aa; 1187f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 11886849ba73SBarry Smith PetscErrorCode ierr; 1189d0f46423SBarry Smith PetscInt m = A->rmap->n,n = A->cmap->n,color,i,j; 119087828ca2SBarry Smith PetscScalar *v = a->v; 1191b0a32e0cSBarry Smith PetscViewer viewer; 1192b05fc000SLisandro Dalcin PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r; 1193f3ef73ceSBarry Smith PetscViewerFormat format; 1194f1af5d2fSBarry Smith 1195f1af5d2fSBarry Smith PetscFunctionBegin; 1196f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1197b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1198b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1199f1af5d2fSBarry Smith 1200f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1201fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1202f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1203b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1204f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1205f1af5d2fSBarry Smith x_l = j; 1206f1af5d2fSBarry Smith x_r = x_l + 1.0; 1207f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1208f1af5d2fSBarry Smith y_l = m - i - 1.0; 1209f1af5d2fSBarry Smith y_r = y_l + 1.0; 1210329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1211b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1212329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1213b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1214f1af5d2fSBarry Smith } else { 1215f1af5d2fSBarry Smith continue; 1216f1af5d2fSBarry Smith } 1217b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1218f1af5d2fSBarry Smith } 1219f1af5d2fSBarry Smith } 1220f1af5d2fSBarry Smith } else { 1221f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1222f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1223b05fc000SLisandro Dalcin PetscReal minv = 0.0, maxv = 0.0; 1224b05fc000SLisandro Dalcin PetscDraw popup; 1225b05fc000SLisandro Dalcin 1226f1af5d2fSBarry Smith for (i = 0; i < m*n; i++) { 1227f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1228f1af5d2fSBarry Smith } 1229b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 1230b05fc000SLisandro Dalcin if (popup) {ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr);} 1231f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1232f1af5d2fSBarry Smith x_l = j; 1233f1af5d2fSBarry Smith x_r = x_l + 1.0; 1234f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1235f1af5d2fSBarry Smith y_l = m - i - 1.0; 1236f1af5d2fSBarry Smith y_r = y_l + 1.0; 1237b05fc000SLisandro Dalcin color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv); 1238b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1239f1af5d2fSBarry Smith } 1240f1af5d2fSBarry Smith } 1241f1af5d2fSBarry Smith } 1242f1af5d2fSBarry Smith PetscFunctionReturn(0); 1243f1af5d2fSBarry Smith } 1244f1af5d2fSBarry Smith 12454a2ae208SSatish Balay #undef __FUNCT__ 12464a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 1247dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1248f1af5d2fSBarry Smith { 1249b0a32e0cSBarry Smith PetscDraw draw; 1250ace3abfcSBarry Smith PetscBool isnull; 1251329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1252dfbe8321SBarry Smith PetscErrorCode ierr; 1253f1af5d2fSBarry Smith 1254f1af5d2fSBarry Smith PetscFunctionBegin; 1255b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1256b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1257abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1258f1af5d2fSBarry Smith 1259f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1260d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1261f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1262b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1263b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 12640298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1265f1af5d2fSBarry Smith PetscFunctionReturn(0); 1266f1af5d2fSBarry Smith } 1267f1af5d2fSBarry Smith 12684a2ae208SSatish Balay #undef __FUNCT__ 12694a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 1270dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1271932b0c3eSLois Curfman McInnes { 1272dfbe8321SBarry Smith PetscErrorCode ierr; 1273ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1274932b0c3eSLois Curfman McInnes 12753a40ed3dSBarry Smith PetscFunctionBegin; 1276251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1277251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1278251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 12790f5bd95cSBarry Smith 1280c45a1595SBarry Smith if (iascii) { 1281c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 12820f5bd95cSBarry Smith } else if (isbinary) { 12833a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1284f1af5d2fSBarry Smith } else if (isdraw) { 1285f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1286932b0c3eSLois Curfman McInnes } 12873a40ed3dSBarry Smith PetscFunctionReturn(0); 1288932b0c3eSLois Curfman McInnes } 1289289bc588SBarry Smith 12904a2ae208SSatish Balay #undef __FUNCT__ 12914a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1292dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat) 1293289bc588SBarry Smith { 1294ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1295dfbe8321SBarry Smith PetscErrorCode ierr; 129690f02eecSBarry Smith 12973a40ed3dSBarry Smith PetscFunctionBegin; 1298aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1299d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1300a5a9c739SBarry Smith #endif 130105b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 1302abc3b08eSStefano Zampini ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr); 13036857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1304bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1305dbd8c25aSHong Zhang 1306dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1307bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 1308bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 13098baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 13108baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 13118baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 13128baccfbdSHong Zhang #endif 1313bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 1314bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1315bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1316bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1317abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 13183bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 13193bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 13203bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 13213a40ed3dSBarry Smith PetscFunctionReturn(0); 1322289bc588SBarry Smith } 1323289bc588SBarry Smith 13244a2ae208SSatish Balay #undef __FUNCT__ 13254a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1326fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1327289bc588SBarry Smith { 1328c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 13296849ba73SBarry Smith PetscErrorCode ierr; 133013f74950SBarry Smith PetscInt k,j,m,n,M; 133187828ca2SBarry Smith PetscScalar *v,tmp; 133248b35521SBarry Smith 13333a40ed3dSBarry Smith PetscFunctionBegin; 1334d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 1335e9695a30SBarry Smith if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */ 1336e7e72b3dSBarry Smith if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1337e7e72b3dSBarry Smith else { 1338d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1339289bc588SBarry Smith for (k=0; k<j; k++) { 13401b807ce4Svictorle tmp = v[j + k*M]; 13411b807ce4Svictorle v[j + k*M] = v[k + j*M]; 13421b807ce4Svictorle v[k + j*M] = tmp; 1343289bc588SBarry Smith } 1344289bc588SBarry Smith } 1345d64ed03dSBarry Smith } 13463a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1347d3e5ee88SLois Curfman McInnes Mat tmat; 1348ec8511deSBarry Smith Mat_SeqDense *tmatd; 134987828ca2SBarry Smith PetscScalar *v2; 1350af36a384SStefano Zampini PetscInt M2; 1351ea709b57SSatish Balay 1352fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX) { 1353ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1354d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 13557adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 13560298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1357fc4dec0aSBarry Smith } else { 1358fc4dec0aSBarry Smith tmat = *matout; 1359fc4dec0aSBarry Smith } 1360ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 1361af36a384SStefano Zampini v = mat->v; v2 = tmatd->v; M2 = tmatd->lda; 1362d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 1363af36a384SStefano Zampini for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M]; 1364d3e5ee88SLois Curfman McInnes } 13656d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 13666d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1367d3e5ee88SLois Curfman McInnes *matout = tmat; 136848b35521SBarry Smith } 13693a40ed3dSBarry Smith PetscFunctionReturn(0); 1370289bc588SBarry Smith } 1371289bc588SBarry Smith 13724a2ae208SSatish Balay #undef __FUNCT__ 13734a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1374ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1375289bc588SBarry Smith { 1376c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1377c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 137813f74950SBarry Smith PetscInt i,j; 1379a2ea699eSBarry Smith PetscScalar *v1,*v2; 13809ea5d5aeSSatish Balay 13813a40ed3dSBarry Smith PetscFunctionBegin; 1382d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1383d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1384d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 13851b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1386d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 13873a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 13881b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 13891b807ce4Svictorle } 1390289bc588SBarry Smith } 139177c4ece6SBarry Smith *flg = PETSC_TRUE; 13923a40ed3dSBarry Smith PetscFunctionReturn(0); 1393289bc588SBarry Smith } 1394289bc588SBarry Smith 13954a2ae208SSatish Balay #undef __FUNCT__ 13964a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1397dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1398289bc588SBarry Smith { 1399c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1400dfbe8321SBarry Smith PetscErrorCode ierr; 140113f74950SBarry Smith PetscInt i,n,len; 140287828ca2SBarry Smith PetscScalar *x,zero = 0.0; 140344cd7ae7SLois Curfman McInnes 14043a40ed3dSBarry Smith PetscFunctionBegin; 14052dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 14067a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 14071ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1408d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1409e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 141044cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 14111b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1412289bc588SBarry Smith } 14131ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 14143a40ed3dSBarry Smith PetscFunctionReturn(0); 1415289bc588SBarry Smith } 1416289bc588SBarry Smith 14174a2ae208SSatish Balay #undef __FUNCT__ 14184a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1419dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1420289bc588SBarry Smith { 1421c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1422f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1423f1ceaac6SMatthew G. Knepley PetscScalar x,*v; 1424dfbe8321SBarry Smith PetscErrorCode ierr; 1425d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 142655659b69SBarry Smith 14273a40ed3dSBarry Smith PetscFunctionBegin; 142828988994SBarry Smith if (ll) { 14297a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 1430f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr); 1431e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1432da3a660dSBarry Smith for (i=0; i<m; i++) { 1433da3a660dSBarry Smith x = l[i]; 1434da3a660dSBarry Smith v = mat->v + i; 1435b43bac26SStefano Zampini for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;} 1436da3a660dSBarry Smith } 1437f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr); 1438eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1439da3a660dSBarry Smith } 144028988994SBarry Smith if (rr) { 14417a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 1442f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr); 1443e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1444da3a660dSBarry Smith for (i=0; i<n; i++) { 1445da3a660dSBarry Smith x = r[i]; 1446b43bac26SStefano Zampini v = mat->v + i*mat->lda; 14472205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1448da3a660dSBarry Smith } 1449f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr); 1450eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1451da3a660dSBarry Smith } 14523a40ed3dSBarry Smith PetscFunctionReturn(0); 1453289bc588SBarry Smith } 1454289bc588SBarry Smith 14554a2ae208SSatish Balay #undef __FUNCT__ 14564a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1457dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1458289bc588SBarry Smith { 1459c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 146087828ca2SBarry Smith PetscScalar *v = mat->v; 1461329f5518SBarry Smith PetscReal sum = 0.0; 1462d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1463efee365bSSatish Balay PetscErrorCode ierr; 146455659b69SBarry Smith 14653a40ed3dSBarry Smith PetscFunctionBegin; 1466289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1467a5ce6ee0Svictorle if (lda>m) { 1468d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1469a5ce6ee0Svictorle v = mat->v+j*lda; 1470a5ce6ee0Svictorle for (i=0; i<m; i++) { 1471a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1472a5ce6ee0Svictorle } 1473a5ce6ee0Svictorle } 1474a5ce6ee0Svictorle } else { 1475d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1476329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1477289bc588SBarry Smith } 1478a5ce6ee0Svictorle } 14798f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1480dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 14813a40ed3dSBarry Smith } else if (type == NORM_1) { 1482064f8208SBarry Smith *nrm = 0.0; 1483d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 14841b807ce4Svictorle v = mat->v + j*mat->lda; 1485289bc588SBarry Smith sum = 0.0; 1486d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 148733a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1488289bc588SBarry Smith } 1489064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1490289bc588SBarry Smith } 1491eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 14923a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1493064f8208SBarry Smith *nrm = 0.0; 1494d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1495289bc588SBarry Smith v = mat->v + j; 1496289bc588SBarry Smith sum = 0.0; 1497d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 14981b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1499289bc588SBarry Smith } 1500064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1501289bc588SBarry Smith } 1502eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1503e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 15043a40ed3dSBarry Smith PetscFunctionReturn(0); 1505289bc588SBarry Smith } 1506289bc588SBarry Smith 15074a2ae208SSatish Balay #undef __FUNCT__ 15084a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1509ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1510289bc588SBarry Smith { 1511c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 151263ba0a88SBarry Smith PetscErrorCode ierr; 151367e560aaSBarry Smith 15143a40ed3dSBarry Smith PetscFunctionBegin; 1515b5a2b587SKris Buschelman switch (op) { 1516b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 15174e0d8c25SBarry Smith aij->roworiented = flg; 1518b5a2b587SKris Buschelman break; 1519512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1520b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 15213971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 15224e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 152313fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1524b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1525b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 15265021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 15275021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 15285021d80fSJed Brown break; 15295021d80fSJed Brown case MAT_SPD: 153077e54ba9SKris Buschelman case MAT_SYMMETRIC: 153177e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 15329a4540c5SBarry Smith case MAT_HERMITIAN: 15339a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 15345021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 153577e54ba9SKris Buschelman break; 1536b5a2b587SKris Buschelman default: 1537e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 15383a40ed3dSBarry Smith } 15393a40ed3dSBarry Smith PetscFunctionReturn(0); 1540289bc588SBarry Smith } 1541289bc588SBarry Smith 15424a2ae208SSatish Balay #undef __FUNCT__ 15434a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1544dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A) 15456f0a148fSBarry Smith { 1546ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 15476849ba73SBarry Smith PetscErrorCode ierr; 1548d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 15493a40ed3dSBarry Smith 15503a40ed3dSBarry Smith PetscFunctionBegin; 1551a5ce6ee0Svictorle if (lda>m) { 1552d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1553a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1554a5ce6ee0Svictorle } 1555a5ce6ee0Svictorle } else { 1556d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1557a5ce6ee0Svictorle } 15583a40ed3dSBarry Smith PetscFunctionReturn(0); 15596f0a148fSBarry Smith } 15606f0a148fSBarry Smith 15614a2ae208SSatish Balay #undef __FUNCT__ 15624a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 15632b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 15646f0a148fSBarry Smith { 156597b48c8fSBarry Smith PetscErrorCode ierr; 1566ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1567b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 156897b48c8fSBarry Smith PetscScalar *slot,*bb; 156997b48c8fSBarry Smith const PetscScalar *xx; 157055659b69SBarry Smith 15713a40ed3dSBarry Smith PetscFunctionBegin; 1572b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1573b9679d65SBarry Smith for (i=0; i<N; i++) { 1574b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1575b9679d65SBarry 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); 1576b9679d65SBarry Smith } 1577b9679d65SBarry Smith #endif 1578b9679d65SBarry Smith 157997b48c8fSBarry Smith /* fix right hand side if needed */ 158097b48c8fSBarry Smith if (x && b) { 158197b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 158297b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 15832205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 158497b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 158597b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 158697b48c8fSBarry Smith } 158797b48c8fSBarry Smith 15886f0a148fSBarry Smith for (i=0; i<N; i++) { 15896f0a148fSBarry Smith slot = l->v + rows[i]; 1590b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 15916f0a148fSBarry Smith } 1592f4df32b1SMatthew Knepley if (diag != 0.0) { 1593b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 15946f0a148fSBarry Smith for (i=0; i<N; i++) { 1595b9679d65SBarry Smith slot = l->v + (m+1)*rows[i]; 1596f4df32b1SMatthew Knepley *slot = diag; 15976f0a148fSBarry Smith } 15986f0a148fSBarry Smith } 15993a40ed3dSBarry Smith PetscFunctionReturn(0); 16006f0a148fSBarry Smith } 1601557bce09SLois Curfman McInnes 16024a2ae208SSatish Balay #undef __FUNCT__ 16038c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense" 16048c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[]) 160564e87e97SBarry Smith { 1606c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 16073a40ed3dSBarry Smith 16083a40ed3dSBarry Smith PetscFunctionBegin; 1609e32f2f54SBarry 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"); 161064e87e97SBarry Smith *array = mat->v; 16113a40ed3dSBarry Smith PetscFunctionReturn(0); 161264e87e97SBarry Smith } 16130754003eSLois Curfman McInnes 16144a2ae208SSatish Balay #undef __FUNCT__ 16158c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense" 16168c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1617ff14e315SSatish Balay { 16183a40ed3dSBarry Smith PetscFunctionBegin; 161909b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 16203a40ed3dSBarry Smith PetscFunctionReturn(0); 1621ff14e315SSatish Balay } 16220754003eSLois Curfman McInnes 16234a2ae208SSatish Balay #undef __FUNCT__ 16248c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray" 1625dec5eb66SMatthew G Knepley /*@C 16268c778c55SBarry Smith MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored 162773a71a0fSBarry Smith 162873a71a0fSBarry Smith Not Collective 162973a71a0fSBarry Smith 163073a71a0fSBarry Smith Input Parameter: 1631579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 163273a71a0fSBarry Smith 163373a71a0fSBarry Smith Output Parameter: 163473a71a0fSBarry Smith . array - pointer to the data 163573a71a0fSBarry Smith 163673a71a0fSBarry Smith Level: intermediate 163773a71a0fSBarry Smith 16388c778c55SBarry Smith .seealso: MatDenseRestoreArray() 163973a71a0fSBarry Smith @*/ 16408c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 164173a71a0fSBarry Smith { 164273a71a0fSBarry Smith PetscErrorCode ierr; 164373a71a0fSBarry Smith 164473a71a0fSBarry Smith PetscFunctionBegin; 16458c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 164673a71a0fSBarry Smith PetscFunctionReturn(0); 164773a71a0fSBarry Smith } 164873a71a0fSBarry Smith 164973a71a0fSBarry Smith #undef __FUNCT__ 16508c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray" 1651dec5eb66SMatthew G Knepley /*@C 1652579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 165373a71a0fSBarry Smith 165473a71a0fSBarry Smith Not Collective 165573a71a0fSBarry Smith 165673a71a0fSBarry Smith Input Parameters: 1657579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 165873a71a0fSBarry Smith . array - pointer to the data 165973a71a0fSBarry Smith 166073a71a0fSBarry Smith Level: intermediate 166173a71a0fSBarry Smith 16628c778c55SBarry Smith .seealso: MatDenseGetArray() 166373a71a0fSBarry Smith @*/ 16648c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 166573a71a0fSBarry Smith { 166673a71a0fSBarry Smith PetscErrorCode ierr; 166773a71a0fSBarry Smith 166873a71a0fSBarry Smith PetscFunctionBegin; 16698c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 167073a71a0fSBarry Smith PetscFunctionReturn(0); 167173a71a0fSBarry Smith } 167273a71a0fSBarry Smith 167373a71a0fSBarry Smith #undef __FUNCT__ 16744a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 167513f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 16760754003eSLois Curfman McInnes { 1677c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 16786849ba73SBarry Smith PetscErrorCode ierr; 16795d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 16805d0c19d7SBarry Smith const PetscInt *irow,*icol; 168187828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 16820754003eSLois Curfman McInnes Mat newmat; 16830754003eSLois Curfman McInnes 16843a40ed3dSBarry Smith PetscFunctionBegin; 168578b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 168678b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1687e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1688e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 16890754003eSLois Curfman McInnes 1690182d2002SSatish Balay /* Check submatrixcall */ 1691182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 169213f74950SBarry Smith PetscInt n_cols,n_rows; 1693182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 169421a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1695f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1696c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 169721a2c019SBarry Smith } 1698182d2002SSatish Balay newmat = *B; 1699182d2002SSatish Balay } else { 17000754003eSLois Curfman McInnes /* Create and fill new matrix */ 1701ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 1702f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 17037adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 17040298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1705182d2002SSatish Balay } 1706182d2002SSatish Balay 1707182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1708182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1709182d2002SSatish Balay 1710182d2002SSatish Balay for (i=0; i<ncols; i++) { 17116de62eeeSBarry Smith av = v + mat->lda*icol[i]; 17122205254eSKarl Rupp for (j=0; j<nrows; j++) *bv++ = av[irow[j]]; 17130754003eSLois Curfman McInnes } 1714182d2002SSatish Balay 1715182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 17166d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 17176d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 17180754003eSLois Curfman McInnes 17190754003eSLois Curfman McInnes /* Free work space */ 172078b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 172178b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1722182d2002SSatish Balay *B = newmat; 17233a40ed3dSBarry Smith PetscFunctionReturn(0); 17240754003eSLois Curfman McInnes } 17250754003eSLois Curfman McInnes 17264a2ae208SSatish Balay #undef __FUNCT__ 17274a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 172813f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1729905e6a2fSBarry Smith { 17306849ba73SBarry Smith PetscErrorCode ierr; 173113f74950SBarry Smith PetscInt i; 1732905e6a2fSBarry Smith 17333a40ed3dSBarry Smith PetscFunctionBegin; 1734905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1735854ce69bSBarry Smith ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr); 1736905e6a2fSBarry Smith } 1737905e6a2fSBarry Smith 1738905e6a2fSBarry Smith for (i=0; i<n; i++) { 17396a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1740905e6a2fSBarry Smith } 17413a40ed3dSBarry Smith PetscFunctionReturn(0); 1742905e6a2fSBarry Smith } 1743905e6a2fSBarry Smith 17444a2ae208SSatish Balay #undef __FUNCT__ 1745c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1746c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1747c0aa2d19SHong Zhang { 1748c0aa2d19SHong Zhang PetscFunctionBegin; 1749c0aa2d19SHong Zhang PetscFunctionReturn(0); 1750c0aa2d19SHong Zhang } 1751c0aa2d19SHong Zhang 1752c0aa2d19SHong Zhang #undef __FUNCT__ 1753c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1754c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1755c0aa2d19SHong Zhang { 1756c0aa2d19SHong Zhang PetscFunctionBegin; 1757c0aa2d19SHong Zhang PetscFunctionReturn(0); 1758c0aa2d19SHong Zhang } 1759c0aa2d19SHong Zhang 1760c0aa2d19SHong Zhang #undef __FUNCT__ 17614a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1762dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 17634b0e389bSBarry Smith { 17644b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 17656849ba73SBarry Smith PetscErrorCode ierr; 1766d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 17673a40ed3dSBarry Smith 17683a40ed3dSBarry Smith PetscFunctionBegin; 176933f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 177033f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1771cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 17723a40ed3dSBarry Smith PetscFunctionReturn(0); 17733a40ed3dSBarry Smith } 1774e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1775a5ce6ee0Svictorle if (lda1>m || lda2>m) { 17760dbb7854Svictorle for (j=0; j<n; j++) { 1777a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1778a5ce6ee0Svictorle } 1779a5ce6ee0Svictorle } else { 1780d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1781a5ce6ee0Svictorle } 1782273d9f13SBarry Smith PetscFunctionReturn(0); 1783273d9f13SBarry Smith } 1784273d9f13SBarry Smith 17854a2ae208SSatish Balay #undef __FUNCT__ 17864994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense" 17874994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A) 1788273d9f13SBarry Smith { 1789dfbe8321SBarry Smith PetscErrorCode ierr; 1790273d9f13SBarry Smith 1791273d9f13SBarry Smith PetscFunctionBegin; 1792273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 17933a40ed3dSBarry Smith PetscFunctionReturn(0); 17944b0e389bSBarry Smith } 17954b0e389bSBarry Smith 1796284134d9SBarry Smith #undef __FUNCT__ 1797ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense" 1798ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1799ba337c44SJed Brown { 1800ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1801ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1802ba337c44SJed Brown PetscScalar *aa = a->v; 1803ba337c44SJed Brown 1804ba337c44SJed Brown PetscFunctionBegin; 1805ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1806ba337c44SJed Brown PetscFunctionReturn(0); 1807ba337c44SJed Brown } 1808ba337c44SJed Brown 1809ba337c44SJed Brown #undef __FUNCT__ 1810ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense" 1811ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1812ba337c44SJed Brown { 1813ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1814ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1815ba337c44SJed Brown PetscScalar *aa = a->v; 1816ba337c44SJed Brown 1817ba337c44SJed Brown PetscFunctionBegin; 1818ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1819ba337c44SJed Brown PetscFunctionReturn(0); 1820ba337c44SJed Brown } 1821ba337c44SJed Brown 1822ba337c44SJed Brown #undef __FUNCT__ 1823ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense" 1824ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 1825ba337c44SJed Brown { 1826ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1827ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1828ba337c44SJed Brown PetscScalar *aa = a->v; 1829ba337c44SJed Brown 1830ba337c44SJed Brown PetscFunctionBegin; 1831ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 1832ba337c44SJed Brown PetscFunctionReturn(0); 1833ba337c44SJed Brown } 1834284134d9SBarry Smith 1835a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1836a9fe9ddaSSatish Balay #undef __FUNCT__ 1837a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1838a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1839a9fe9ddaSSatish Balay { 1840a9fe9ddaSSatish Balay PetscErrorCode ierr; 1841a9fe9ddaSSatish Balay 1842a9fe9ddaSSatish Balay PetscFunctionBegin; 1843a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 18443ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1845a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 18463ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1847a9fe9ddaSSatish Balay } 18483ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1849a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 18503ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1851a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1852a9fe9ddaSSatish Balay } 1853a9fe9ddaSSatish Balay 1854a9fe9ddaSSatish Balay #undef __FUNCT__ 1855a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1856a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1857a9fe9ddaSSatish Balay { 1858ee16a9a1SHong Zhang PetscErrorCode ierr; 1859d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1860ee16a9a1SHong Zhang Mat Cmat; 1861a9fe9ddaSSatish Balay 1862ee16a9a1SHong Zhang PetscFunctionBegin; 1863e32f2f54SBarry 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); 1864ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1865ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1866ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 18670298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 1868d73949e8SHong Zhang 1869ee16a9a1SHong Zhang *C = Cmat; 1870ee16a9a1SHong Zhang PetscFunctionReturn(0); 1871ee16a9a1SHong Zhang } 1872a9fe9ddaSSatish Balay 187398a3b096SSatish Balay #undef __FUNCT__ 1874a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1875a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1876a9fe9ddaSSatish Balay { 1877a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1878a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1879a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 18800805154bSBarry Smith PetscBLASInt m,n,k; 1881a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1882c5df96a5SBarry Smith PetscErrorCode ierr; 1883fd4e9aacSBarry Smith PetscBool flg; 1884a9fe9ddaSSatish Balay 1885a9fe9ddaSSatish Balay PetscFunctionBegin; 1886fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr); 1887fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense"); 1888fd4e9aacSBarry Smith 1889fd4e9aacSBarry Smith /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/ 1890fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr); 1891fd4e9aacSBarry Smith if (flg) { 1892fd4e9aacSBarry Smith C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense; 1893fd4e9aacSBarry Smith ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr); 1894fd4e9aacSBarry Smith PetscFunctionReturn(0); 1895fd4e9aacSBarry Smith } 1896fd4e9aacSBarry Smith 1897fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr); 1898fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense"); 1899c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1900c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1901c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 19025ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1903a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1904a9fe9ddaSSatish Balay } 1905a9fe9ddaSSatish Balay 1906a9fe9ddaSSatish Balay #undef __FUNCT__ 190775648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense" 190875648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1909a9fe9ddaSSatish Balay { 1910a9fe9ddaSSatish Balay PetscErrorCode ierr; 1911a9fe9ddaSSatish Balay 1912a9fe9ddaSSatish Balay PetscFunctionBegin; 1913a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 19143ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 191575648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 19163ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1917a9fe9ddaSSatish Balay } 19183ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 191975648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 19203ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1921a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1922a9fe9ddaSSatish Balay } 1923a9fe9ddaSSatish Balay 1924a9fe9ddaSSatish Balay #undef __FUNCT__ 192575648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense" 192675648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1927a9fe9ddaSSatish Balay { 1928ee16a9a1SHong Zhang PetscErrorCode ierr; 1929d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1930ee16a9a1SHong Zhang Mat Cmat; 1931a9fe9ddaSSatish Balay 1932ee16a9a1SHong Zhang PetscFunctionBegin; 1933e32f2f54SBarry 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); 1934ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1935ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1936ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 19370298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 19382205254eSKarl Rupp 1939ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 19402205254eSKarl Rupp 1941ee16a9a1SHong Zhang *C = Cmat; 1942ee16a9a1SHong Zhang PetscFunctionReturn(0); 1943ee16a9a1SHong Zhang } 1944a9fe9ddaSSatish Balay 1945a9fe9ddaSSatish Balay #undef __FUNCT__ 194675648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense" 194775648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1948a9fe9ddaSSatish Balay { 1949a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1950a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1951a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 19520805154bSBarry Smith PetscBLASInt m,n,k; 1953a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1954c5df96a5SBarry Smith PetscErrorCode ierr; 1955a9fe9ddaSSatish Balay 1956a9fe9ddaSSatish Balay PetscFunctionBegin; 1957c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr); 1958c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1959c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 19602fbe02b9SBarry Smith /* 19612fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 19622fbe02b9SBarry Smith */ 19635ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1964a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1965a9fe9ddaSSatish Balay } 1966985db425SBarry Smith 1967985db425SBarry Smith #undef __FUNCT__ 1968985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 1969985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1970985db425SBarry Smith { 1971985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1972985db425SBarry Smith PetscErrorCode ierr; 1973d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1974985db425SBarry Smith PetscScalar *x; 1975985db425SBarry Smith MatScalar *aa = a->v; 1976985db425SBarry Smith 1977985db425SBarry Smith PetscFunctionBegin; 1978e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1979985db425SBarry Smith 1980985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1981985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1982985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1983e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1984985db425SBarry Smith for (i=0; i<m; i++) { 1985985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1986985db425SBarry Smith for (j=1; j<n; j++) { 1987985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1988985db425SBarry Smith } 1989985db425SBarry Smith } 1990985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1991985db425SBarry Smith PetscFunctionReturn(0); 1992985db425SBarry Smith } 1993985db425SBarry Smith 1994985db425SBarry Smith #undef __FUNCT__ 1995985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 1996985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 1997985db425SBarry Smith { 1998985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1999985db425SBarry Smith PetscErrorCode ierr; 2000d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2001985db425SBarry Smith PetscScalar *x; 2002985db425SBarry Smith PetscReal atmp; 2003985db425SBarry Smith MatScalar *aa = a->v; 2004985db425SBarry Smith 2005985db425SBarry Smith PetscFunctionBegin; 2006e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2007985db425SBarry Smith 2008985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2009985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2010985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2011e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2012985db425SBarry Smith for (i=0; i<m; i++) { 20139189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 2014985db425SBarry Smith for (j=1; j<n; j++) { 2015985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 2016985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 2017985db425SBarry Smith } 2018985db425SBarry Smith } 2019985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2020985db425SBarry Smith PetscFunctionReturn(0); 2021985db425SBarry Smith } 2022985db425SBarry Smith 2023985db425SBarry Smith #undef __FUNCT__ 2024985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 2025985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 2026985db425SBarry Smith { 2027985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2028985db425SBarry Smith PetscErrorCode ierr; 2029d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2030985db425SBarry Smith PetscScalar *x; 2031985db425SBarry Smith MatScalar *aa = a->v; 2032985db425SBarry Smith 2033985db425SBarry Smith PetscFunctionBegin; 2034e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2035985db425SBarry Smith 2036985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2037985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2038985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2039e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2040985db425SBarry Smith for (i=0; i<m; i++) { 2041985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2042985db425SBarry Smith for (j=1; j<n; j++) { 2043985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 2044985db425SBarry Smith } 2045985db425SBarry Smith } 2046985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2047985db425SBarry Smith PetscFunctionReturn(0); 2048985db425SBarry Smith } 2049985db425SBarry Smith 20508d0534beSBarry Smith #undef __FUNCT__ 20518d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 20528d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 20538d0534beSBarry Smith { 20548d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 20558d0534beSBarry Smith PetscErrorCode ierr; 20568d0534beSBarry Smith PetscScalar *x; 20578d0534beSBarry Smith 20588d0534beSBarry Smith PetscFunctionBegin; 2059e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 20608d0534beSBarry Smith 20618d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2062d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 20638d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 20648d0534beSBarry Smith PetscFunctionReturn(0); 20658d0534beSBarry Smith } 20668d0534beSBarry Smith 20670716a85fSBarry Smith 20680716a85fSBarry Smith #undef __FUNCT__ 20690716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense" 20700716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 20710716a85fSBarry Smith { 20720716a85fSBarry Smith PetscErrorCode ierr; 20730716a85fSBarry Smith PetscInt i,j,m,n; 20740716a85fSBarry Smith PetscScalar *a; 20750716a85fSBarry Smith 20760716a85fSBarry Smith PetscFunctionBegin; 20770716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 20780716a85fSBarry Smith ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); 20798c778c55SBarry Smith ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr); 20800716a85fSBarry Smith if (type == NORM_2) { 20810716a85fSBarry Smith for (i=0; i<n; i++) { 20820716a85fSBarry Smith for (j=0; j<m; j++) { 20830716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 20840716a85fSBarry Smith } 20850716a85fSBarry Smith a += m; 20860716a85fSBarry Smith } 20870716a85fSBarry Smith } else if (type == NORM_1) { 20880716a85fSBarry Smith for (i=0; i<n; i++) { 20890716a85fSBarry Smith for (j=0; j<m; j++) { 20900716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 20910716a85fSBarry Smith } 20920716a85fSBarry Smith a += m; 20930716a85fSBarry Smith } 20940716a85fSBarry Smith } else if (type == NORM_INFINITY) { 20950716a85fSBarry Smith for (i=0; i<n; i++) { 20960716a85fSBarry Smith for (j=0; j<m; j++) { 20970716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 20980716a85fSBarry Smith } 20990716a85fSBarry Smith a += m; 21000716a85fSBarry Smith } 2101ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 21028c778c55SBarry Smith ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr); 21030716a85fSBarry Smith if (type == NORM_2) { 21048f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 21050716a85fSBarry Smith } 21060716a85fSBarry Smith PetscFunctionReturn(0); 21070716a85fSBarry Smith } 21080716a85fSBarry Smith 210973a71a0fSBarry Smith #undef __FUNCT__ 211073a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense" 211173a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 211273a71a0fSBarry Smith { 211373a71a0fSBarry Smith PetscErrorCode ierr; 211473a71a0fSBarry Smith PetscScalar *a; 211573a71a0fSBarry Smith PetscInt m,n,i; 211673a71a0fSBarry Smith 211773a71a0fSBarry Smith PetscFunctionBegin; 211873a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 21198c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 212073a71a0fSBarry Smith for (i=0; i<m*n; i++) { 212173a71a0fSBarry Smith ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr); 212273a71a0fSBarry Smith } 21238c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 212473a71a0fSBarry Smith PetscFunctionReturn(0); 212573a71a0fSBarry Smith } 212673a71a0fSBarry Smith 21273b49f96aSBarry Smith #undef __FUNCT__ 21283b49f96aSBarry Smith #define __FUNCT__ "MatMissingDiagonal_SeqDense" 21293b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool *missing,PetscInt *d) 21303b49f96aSBarry Smith { 21313b49f96aSBarry Smith PetscFunctionBegin; 21323b49f96aSBarry Smith *missing = PETSC_FALSE; 21333b49f96aSBarry Smith PetscFunctionReturn(0); 21343b49f96aSBarry Smith } 213573a71a0fSBarry Smith 2136abc3b08eSStefano Zampini 2137289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2138a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2139905e6a2fSBarry Smith MatGetRow_SeqDense, 2140905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2141905e6a2fSBarry Smith MatMult_SeqDense, 214297304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 21437c922b88SBarry Smith MatMultTranspose_SeqDense, 21447c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2145db4efbfdSBarry Smith 0, 2146db4efbfdSBarry Smith 0, 2147db4efbfdSBarry Smith 0, 2148db4efbfdSBarry Smith /* 10*/ 0, 2149905e6a2fSBarry Smith MatLUFactor_SeqDense, 2150905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 215141f059aeSBarry Smith MatSOR_SeqDense, 2152ec8511deSBarry Smith MatTranspose_SeqDense, 215397304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2154905e6a2fSBarry Smith MatEqual_SeqDense, 2155905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2156905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2157905e6a2fSBarry Smith MatNorm_SeqDense, 2158c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2159c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2160905e6a2fSBarry Smith MatSetOption_SeqDense, 2161905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2162d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2163db4efbfdSBarry Smith 0, 2164db4efbfdSBarry Smith 0, 2165db4efbfdSBarry Smith 0, 2166db4efbfdSBarry Smith 0, 21674994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2168273d9f13SBarry Smith 0, 2169905e6a2fSBarry Smith 0, 217073a71a0fSBarry Smith 0, 217173a71a0fSBarry Smith 0, 2172d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2173a5ae1ecdSBarry Smith 0, 2174a5ae1ecdSBarry Smith 0, 2175a5ae1ecdSBarry Smith 0, 2176a5ae1ecdSBarry Smith 0, 2177d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 2178a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 2179a5ae1ecdSBarry Smith 0, 21804b0e389bSBarry Smith MatGetValues_SeqDense, 2181a5ae1ecdSBarry Smith MatCopy_SeqDense, 2182d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2183a5ae1ecdSBarry Smith MatScale_SeqDense, 21847d68702bSBarry Smith MatShift_Basic, 2185a5ae1ecdSBarry Smith 0, 2186*3f49a652SStefano Zampini MatZeroRowsColumns_SeqDense, 218773a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2188a5ae1ecdSBarry Smith 0, 2189a5ae1ecdSBarry Smith 0, 2190a5ae1ecdSBarry Smith 0, 2191a5ae1ecdSBarry Smith 0, 2192d519adbfSMatthew Knepley /* 54*/ 0, 2193a5ae1ecdSBarry Smith 0, 2194a5ae1ecdSBarry Smith 0, 2195a5ae1ecdSBarry Smith 0, 2196a5ae1ecdSBarry Smith 0, 2197d519adbfSMatthew Knepley /* 59*/ 0, 2198e03a110bSBarry Smith MatDestroy_SeqDense, 2199e03a110bSBarry Smith MatView_SeqDense, 2200357abbc8SBarry Smith 0, 220197304618SKris Buschelman 0, 2202d519adbfSMatthew Knepley /* 64*/ 0, 220397304618SKris Buschelman 0, 220497304618SKris Buschelman 0, 220597304618SKris Buschelman 0, 220697304618SKris Buschelman 0, 2207d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 220897304618SKris Buschelman 0, 220997304618SKris Buschelman 0, 221097304618SKris Buschelman 0, 221197304618SKris Buschelman 0, 2212d519adbfSMatthew Knepley /* 74*/ 0, 221397304618SKris Buschelman 0, 221497304618SKris Buschelman 0, 221597304618SKris Buschelman 0, 221697304618SKris Buschelman 0, 2217d519adbfSMatthew Knepley /* 79*/ 0, 221897304618SKris Buschelman 0, 221997304618SKris Buschelman 0, 222097304618SKris Buschelman 0, 22215bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2222865e5f61SKris Buschelman 0, 22231cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2224865e5f61SKris Buschelman 0, 2225865e5f61SKris Buschelman 0, 2226865e5f61SKris Buschelman 0, 2227d519adbfSMatthew Knepley /* 89*/ MatMatMult_SeqDense_SeqDense, 2228a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 2229a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2230abc3b08eSStefano Zampini MatPtAP_SeqDense_SeqDense, 2231abc3b08eSStefano Zampini MatPtAPSymbolic_SeqDense_SeqDense, 2232abc3b08eSStefano Zampini /* 94*/ MatPtAPNumeric_SeqDense_SeqDense, 22335df89d91SHong Zhang 0, 22345df89d91SHong Zhang 0, 22355df89d91SHong Zhang 0, 2236284134d9SBarry Smith 0, 2237d519adbfSMatthew Knepley /* 99*/ 0, 2238284134d9SBarry Smith 0, 2239284134d9SBarry Smith 0, 2240ba337c44SJed Brown MatConjugate_SeqDense, 2241f73d5cc4SBarry Smith 0, 2242ba337c44SJed Brown /*104*/ 0, 2243ba337c44SJed Brown MatRealPart_SeqDense, 2244ba337c44SJed Brown MatImaginaryPart_SeqDense, 2245985db425SBarry Smith 0, 2246985db425SBarry Smith 0, 224785e2c93fSHong Zhang /*109*/ MatMatSolve_SeqDense, 2248985db425SBarry Smith 0, 22498d0534beSBarry Smith MatGetRowMin_SeqDense, 2250aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 22513b49f96aSBarry Smith MatMissingDiagonal_SeqDense, 2252aabbc4fbSShri Abhyankar /*114*/ 0, 2253aabbc4fbSShri Abhyankar 0, 2254aabbc4fbSShri Abhyankar 0, 2255aabbc4fbSShri Abhyankar 0, 2256aabbc4fbSShri Abhyankar 0, 2257aabbc4fbSShri Abhyankar /*119*/ 0, 2258aabbc4fbSShri Abhyankar 0, 2259aabbc4fbSShri Abhyankar 0, 22600716a85fSBarry Smith 0, 22610716a85fSBarry Smith 0, 22620716a85fSBarry Smith /*124*/ 0, 22635df89d91SHong Zhang MatGetColumnNorms_SeqDense, 22645df89d91SHong Zhang 0, 22655df89d91SHong Zhang 0, 22665df89d91SHong Zhang 0, 22675df89d91SHong Zhang /*129*/ 0, 226875648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 226975648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 227075648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 22713964eb88SJed Brown 0, 22723964eb88SJed Brown /*134*/ 0, 22733964eb88SJed Brown 0, 22743964eb88SJed Brown 0, 22753964eb88SJed Brown 0, 22763964eb88SJed Brown 0, 22773964eb88SJed Brown /*139*/ 0, 2278f9426fe0SMark Adams 0, 22793964eb88SJed Brown 0 2280985db425SBarry Smith }; 228190ace30eSBarry Smith 22824a2ae208SSatish Balay #undef __FUNCT__ 22834a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 22844b828684SBarry Smith /*@C 2285fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2286d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2287d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2288289bc588SBarry Smith 2289db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2290db81eaa0SLois Curfman McInnes 229120563c6bSBarry Smith Input Parameters: 2292db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 22930c775827SLois Curfman McInnes . m - number of rows 229418f449edSLois Curfman McInnes . n - number of columns 22950298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2296dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 229720563c6bSBarry Smith 229820563c6bSBarry Smith Output Parameter: 229944cd7ae7SLois Curfman McInnes . A - the matrix 230020563c6bSBarry Smith 2301b259b22eSLois Curfman McInnes Notes: 230218f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 230318f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 23040298fd71SBarry Smith set data=NULL. 230518f449edSLois Curfman McInnes 2306027ccd11SLois Curfman McInnes Level: intermediate 2307027ccd11SLois Curfman McInnes 2308dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 2309d65003e9SLois Curfman McInnes 231069b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 231120563c6bSBarry Smith @*/ 23127087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2313289bc588SBarry Smith { 2314dfbe8321SBarry Smith PetscErrorCode ierr; 23153b2fbd54SBarry Smith 23163a40ed3dSBarry Smith PetscFunctionBegin; 2317f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2318f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2319273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2320273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2321273d9f13SBarry Smith PetscFunctionReturn(0); 2322273d9f13SBarry Smith } 2323273d9f13SBarry Smith 23244a2ae208SSatish Balay #undef __FUNCT__ 2325afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 2326273d9f13SBarry Smith /*@C 2327273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2328273d9f13SBarry Smith 2329273d9f13SBarry Smith Collective on MPI_Comm 2330273d9f13SBarry Smith 2331273d9f13SBarry Smith Input Parameters: 23321c4f3114SJed Brown + B - the matrix 23330298fd71SBarry Smith - data - the array (or NULL) 2334273d9f13SBarry Smith 2335273d9f13SBarry Smith Notes: 2336273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2337273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2338284134d9SBarry Smith need not call this routine. 2339273d9f13SBarry Smith 2340273d9f13SBarry Smith Level: intermediate 2341273d9f13SBarry Smith 2342273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2343273d9f13SBarry Smith 234469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2345867c911aSBarry Smith 2346273d9f13SBarry Smith @*/ 23477087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2348273d9f13SBarry Smith { 23494ac538c5SBarry Smith PetscErrorCode ierr; 2350a23d5eceSKris Buschelman 2351a23d5eceSKris Buschelman PetscFunctionBegin; 23524ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2353a23d5eceSKris Buschelman PetscFunctionReturn(0); 2354a23d5eceSKris Buschelman } 2355a23d5eceSKris Buschelman 2356a23d5eceSKris Buschelman #undef __FUNCT__ 2357afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 23587087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2359a23d5eceSKris Buschelman { 2360273d9f13SBarry Smith Mat_SeqDense *b; 2361dfbe8321SBarry Smith PetscErrorCode ierr; 2362273d9f13SBarry Smith 2363273d9f13SBarry Smith PetscFunctionBegin; 2364273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2365a868139aSShri Abhyankar 236634ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 236734ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 236834ef9618SShri Abhyankar 2369273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 237086d161a7SShri Abhyankar b->Mmax = B->rmap->n; 237186d161a7SShri Abhyankar b->Nmax = B->cmap->n; 237286d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 237386d161a7SShri Abhyankar 23749e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 23759e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2376e92229d0SSatish Balay ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr); 23773bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 23782205254eSKarl Rupp 23799e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2380273d9f13SBarry Smith } else { /* user-allocated storage */ 23819e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2382273d9f13SBarry Smith b->v = data; 2383273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2384273d9f13SBarry Smith } 23850450473dSBarry Smith B->assembled = PETSC_TRUE; 2386273d9f13SBarry Smith PetscFunctionReturn(0); 2387273d9f13SBarry Smith } 2388273d9f13SBarry Smith 238965b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 23901b807ce4Svictorle #undef __FUNCT__ 23918baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental" 23928baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 23938baccfbdSHong Zhang { 2394d77f618aSHong Zhang Mat mat_elemental; 2395d77f618aSHong Zhang PetscErrorCode ierr; 2396d77f618aSHong Zhang PetscScalar *array,*v_colwise; 2397d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 2398d77f618aSHong Zhang 23998baccfbdSHong Zhang PetscFunctionBegin; 2400d77f618aSHong Zhang ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr); 2401d77f618aSHong Zhang ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr); 2402d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 2403d77f618aSHong Zhang k = 0; 2404d77f618aSHong Zhang for (j=0; j<N; j++) { 2405d77f618aSHong Zhang cols[j] = j; 2406d77f618aSHong Zhang for (i=0; i<M; i++) { 2407d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 2408d77f618aSHong Zhang } 2409d77f618aSHong Zhang } 2410d77f618aSHong Zhang for (i=0; i<M; i++) { 2411d77f618aSHong Zhang rows[i] = i; 2412d77f618aSHong Zhang } 2413d77f618aSHong Zhang ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr); 2414d77f618aSHong Zhang 2415d77f618aSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr); 2416d77f618aSHong Zhang ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 2417d77f618aSHong Zhang ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr); 2418d77f618aSHong Zhang ierr = MatSetUp(mat_elemental);CHKERRQ(ierr); 2419d77f618aSHong Zhang 2420d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 2421d77f618aSHong Zhang ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr); 2422d77f618aSHong Zhang ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2423d77f618aSHong Zhang ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2424d77f618aSHong Zhang ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr); 2425d77f618aSHong Zhang 2426511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 242728be2f97SBarry Smith ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr); 2428d77f618aSHong Zhang } else { 2429d77f618aSHong Zhang *newmat = mat_elemental; 2430d77f618aSHong Zhang } 24318baccfbdSHong Zhang PetscFunctionReturn(0); 24328baccfbdSHong Zhang } 243365b80a83SHong Zhang #endif 24348baccfbdSHong Zhang 24358baccfbdSHong Zhang #undef __FUNCT__ 24361b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 24371b807ce4Svictorle /*@C 24381b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 24391b807ce4Svictorle 24401b807ce4Svictorle Input parameter: 24411b807ce4Svictorle + A - the matrix 24421b807ce4Svictorle - lda - the leading dimension 24431b807ce4Svictorle 24441b807ce4Svictorle Notes: 2445867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 24461b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 24471b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 24481b807ce4Svictorle 24491b807ce4Svictorle Level: intermediate 24501b807ce4Svictorle 24511b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 24521b807ce4Svictorle 2453284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2454867c911aSBarry Smith 24551b807ce4Svictorle @*/ 24567087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 24571b807ce4Svictorle { 24581b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 245921a2c019SBarry Smith 24601b807ce4Svictorle PetscFunctionBegin; 2461e32f2f54SBarry 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); 24621b807ce4Svictorle b->lda = lda; 246321a2c019SBarry Smith b->changelda = PETSC_FALSE; 246421a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 24651b807ce4Svictorle PetscFunctionReturn(0); 24661b807ce4Svictorle } 24671b807ce4Svictorle 24680bad9183SKris Buschelman /*MC 2469fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 24700bad9183SKris Buschelman 24710bad9183SKris Buschelman Options Database Keys: 24720bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 24730bad9183SKris Buschelman 24740bad9183SKris Buschelman Level: beginner 24750bad9183SKris Buschelman 247689665df3SBarry Smith .seealso: MatCreateSeqDense() 247789665df3SBarry Smith 24780bad9183SKris Buschelman M*/ 24790bad9183SKris Buschelman 24804a2ae208SSatish Balay #undef __FUNCT__ 24814a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 24828cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B) 2483273d9f13SBarry Smith { 2484273d9f13SBarry Smith Mat_SeqDense *b; 2485dfbe8321SBarry Smith PetscErrorCode ierr; 24867c334f02SBarry Smith PetscMPIInt size; 2487273d9f13SBarry Smith 2488273d9f13SBarry Smith PetscFunctionBegin; 2489ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 2490e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 249155659b69SBarry Smith 2492b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 2493549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 249444cd7ae7SLois Curfman McInnes B->data = (void*)b; 249518f449edSLois Curfman McInnes 249644cd7ae7SLois Curfman McInnes b->pivots = 0; 2497273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2498273d9f13SBarry Smith b->v = 0; 249921a2c019SBarry Smith b->changelda = PETSC_FALSE; 25004e220ebcSLois Curfman McInnes 2501bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 2502bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2503bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 25048baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 25058baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 25068baccfbdSHong Zhang #endif 2507bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 2508bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2509bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2510bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2511abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 25123bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 25133bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 25143bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 251517667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 25163a40ed3dSBarry Smith PetscFunctionReturn(0); 2517289bc588SBarry Smith } 2518