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 113f49a652SStefano Zampini PetscErrorCode MatZeroRowsColumns_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 123f49a652SStefano Zampini { 133f49a652SStefano Zampini PetscErrorCode ierr; 143f49a652SStefano Zampini Mat_SeqDense *l = (Mat_SeqDense*)A->data; 153f49a652SStefano Zampini PetscInt m = l->lda, n = A->cmap->n,r = A->rmap->n, i,j; 163f49a652SStefano Zampini PetscScalar *slot,*bb; 173f49a652SStefano Zampini const PetscScalar *xx; 183f49a652SStefano Zampini 193f49a652SStefano Zampini PetscFunctionBegin; 203f49a652SStefano Zampini #if defined(PETSC_USE_DEBUG) 213f49a652SStefano Zampini for (i=0; i<N; i++) { 223f49a652SStefano Zampini if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 233f49a652SStefano 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); 243f49a652SStefano 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); 253f49a652SStefano Zampini } 263f49a652SStefano Zampini #endif 273f49a652SStefano Zampini 283f49a652SStefano Zampini /* fix right hand side if needed */ 293f49a652SStefano Zampini if (x && b) { 303f49a652SStefano Zampini ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 313f49a652SStefano Zampini ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 323f49a652SStefano Zampini for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 333f49a652SStefano Zampini ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 343f49a652SStefano Zampini ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 353f49a652SStefano Zampini } 363f49a652SStefano Zampini 373f49a652SStefano Zampini for (i=0; i<N; i++) { 383f49a652SStefano Zampini slot = l->v + rows[i]*m; 393f49a652SStefano Zampini ierr = PetscMemzero(slot,r*sizeof(PetscScalar));CHKERRQ(ierr); 403f49a652SStefano Zampini } 413f49a652SStefano Zampini for (i=0; i<N; i++) { 423f49a652SStefano Zampini slot = l->v + rows[i]; 433f49a652SStefano Zampini for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 443f49a652SStefano Zampini } 453f49a652SStefano Zampini if (diag != 0.0) { 463f49a652SStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 473f49a652SStefano Zampini for (i=0; i<N; i++) { 483f49a652SStefano Zampini slot = l->v + (m+1)*rows[i]; 493f49a652SStefano Zampini *slot = diag; 503f49a652SStefano Zampini } 513f49a652SStefano Zampini } 523f49a652SStefano Zampini PetscFunctionReturn(0); 533f49a652SStefano Zampini } 543f49a652SStefano Zampini 55abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C) 56abc3b08eSStefano Zampini { 57abc3b08eSStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)(C->data); 58abc3b08eSStefano Zampini PetscErrorCode ierr; 59abc3b08eSStefano Zampini 60abc3b08eSStefano Zampini PetscFunctionBegin; 61abc3b08eSStefano Zampini ierr = MatMatMultNumeric_SeqDense_SeqDense(A,P,c->ptapwork);CHKERRQ(ierr); 62abc3b08eSStefano Zampini ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(P,c->ptapwork,C);CHKERRQ(ierr); 63abc3b08eSStefano Zampini PetscFunctionReturn(0); 64abc3b08eSStefano Zampini } 65abc3b08eSStefano Zampini 66abc3b08eSStefano Zampini PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat *C) 67abc3b08eSStefano Zampini { 68abc3b08eSStefano Zampini Mat_SeqDense *c; 69abc3b08eSStefano Zampini PetscErrorCode ierr; 70abc3b08eSStefano Zampini 71abc3b08eSStefano Zampini PetscFunctionBegin; 72abc3b08eSStefano Zampini ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),P->cmap->N,P->cmap->N,NULL,C);CHKERRQ(ierr); 73abc3b08eSStefano Zampini c = (Mat_SeqDense*)((*C)->data); 74abc3b08eSStefano Zampini ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),A->rmap->N,P->cmap->N,NULL,&c->ptapwork);CHKERRQ(ierr); 75abc3b08eSStefano Zampini PetscFunctionReturn(0); 76abc3b08eSStefano Zampini } 77abc3b08eSStefano Zampini 78150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatPtAP_SeqDense_SeqDense(Mat A,Mat P,MatReuse reuse,PetscReal fill,Mat *C) 79abc3b08eSStefano Zampini { 80abc3b08eSStefano Zampini PetscErrorCode ierr; 81abc3b08eSStefano Zampini 82abc3b08eSStefano Zampini PetscFunctionBegin; 83abc3b08eSStefano Zampini if (reuse == MAT_INITIAL_MATRIX) { 84abc3b08eSStefano Zampini ierr = MatPtAPSymbolic_SeqDense_SeqDense(A,P,fill,C);CHKERRQ(ierr); 85abc3b08eSStefano Zampini } 86abc3b08eSStefano Zampini ierr = PetscLogEventBegin(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 87abc3b08eSStefano Zampini ierr = (*(*C)->ops->ptapnumeric)(A,P,*C);CHKERRQ(ierr); 88abc3b08eSStefano Zampini ierr = PetscLogEventEnd(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 89abc3b08eSStefano Zampini PetscFunctionReturn(0); 90abc3b08eSStefano Zampini } 91abc3b08eSStefano Zampini 92cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat) 93b49cda9fSStefano Zampini { 94a13144ffSStefano Zampini Mat B = NULL; 95b49cda9fSStefano Zampini Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 96b49cda9fSStefano Zampini Mat_SeqDense *b; 97b49cda9fSStefano Zampini PetscErrorCode ierr; 98b49cda9fSStefano Zampini PetscInt *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i; 99b49cda9fSStefano Zampini MatScalar *av=a->a; 100a13144ffSStefano Zampini PetscBool isseqdense; 101b49cda9fSStefano Zampini 102b49cda9fSStefano Zampini PetscFunctionBegin; 103a13144ffSStefano Zampini if (reuse == MAT_REUSE_MATRIX) { 104a13144ffSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)*newmat,MATSEQDENSE,&isseqdense);CHKERRQ(ierr); 105a13144ffSStefano Zampini if (!isseqdense) SETERRQ1(PetscObjectComm((PetscObject)*newmat),PETSC_ERR_USER,"Cannot reuse matrix of type %s",((PetscObject)(*newmat))->type); 106a13144ffSStefano Zampini } 107a13144ffSStefano Zampini if (reuse != MAT_REUSE_MATRIX) { 108b49cda9fSStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 109b49cda9fSStefano Zampini ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr); 110b49cda9fSStefano Zampini ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr); 111b49cda9fSStefano Zampini ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr); 112b49cda9fSStefano Zampini b = (Mat_SeqDense*)(B->data); 113a13144ffSStefano Zampini } else { 114a13144ffSStefano Zampini b = (Mat_SeqDense*)((*newmat)->data); 115a13144ffSStefano Zampini ierr = PetscMemzero(b->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr); 116a13144ffSStefano Zampini } 117b49cda9fSStefano Zampini for (i=0; i<m; i++) { 118b49cda9fSStefano Zampini PetscInt j; 119b49cda9fSStefano Zampini for (j=0;j<ai[1]-ai[0];j++) { 120b49cda9fSStefano Zampini b->v[*aj*m+i] = *av; 121b49cda9fSStefano Zampini aj++; 122b49cda9fSStefano Zampini av++; 123b49cda9fSStefano Zampini } 124b49cda9fSStefano Zampini ai++; 125b49cda9fSStefano Zampini } 126b49cda9fSStefano Zampini 127511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 128a13144ffSStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 129a13144ffSStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 13028be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 131b49cda9fSStefano Zampini } else { 132a13144ffSStefano Zampini if (B) *newmat = B; 133a13144ffSStefano Zampini ierr = MatAssemblyBegin(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 134a13144ffSStefano Zampini ierr = MatAssemblyEnd(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 135b49cda9fSStefano Zampini } 136b49cda9fSStefano Zampini PetscFunctionReturn(0); 137b49cda9fSStefano Zampini } 138b49cda9fSStefano Zampini 139cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 1406a63e612SBarry Smith { 1416a63e612SBarry Smith Mat B; 1426a63e612SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1436a63e612SBarry Smith PetscErrorCode ierr; 1449399e1b8SMatthew G. Knepley PetscInt i, j; 1459399e1b8SMatthew G. Knepley PetscInt *rows, *nnz; 1469399e1b8SMatthew G. Knepley MatScalar *aa = a->v, *vals; 1476a63e612SBarry Smith 1486a63e612SBarry Smith PetscFunctionBegin; 149ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 1506a63e612SBarry Smith ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 1516a63e612SBarry Smith ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr); 1529399e1b8SMatthew G. Knepley ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr); 1539399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 1549399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i]; 1556a63e612SBarry Smith aa += a->lda; 1566a63e612SBarry Smith } 1579399e1b8SMatthew G. Knepley ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr); 1589399e1b8SMatthew G. Knepley aa = a->v; 1599399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 1609399e1b8SMatthew G. Knepley PetscInt numRows = 0; 1619399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];} 1629399e1b8SMatthew G. Knepley ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr); 1639399e1b8SMatthew G. Knepley aa += a->lda; 1649399e1b8SMatthew G. Knepley } 1659399e1b8SMatthew G. Knepley ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr); 1666a63e612SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1676a63e612SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1686a63e612SBarry Smith 169511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 17028be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 1716a63e612SBarry Smith } else { 1726a63e612SBarry Smith *newmat = B; 1736a63e612SBarry Smith } 1746a63e612SBarry Smith PetscFunctionReturn(0); 1756a63e612SBarry Smith } 1766a63e612SBarry Smith 177e0877f53SBarry Smith static PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 1781987afe7SBarry Smith { 1791987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 180f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 18113f74950SBarry Smith PetscInt j; 1820805154bSBarry Smith PetscBLASInt N,m,ldax,lday,one = 1; 183efee365bSSatish Balay PetscErrorCode ierr; 1843a40ed3dSBarry Smith 1853a40ed3dSBarry Smith PetscFunctionBegin; 186c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr); 187c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr); 188c5df96a5SBarry Smith ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr); 189c5df96a5SBarry Smith ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr); 190a5ce6ee0Svictorle if (ldax>m || lday>m) { 191d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 1928b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one)); 193a5ce6ee0Svictorle } 194a5ce6ee0Svictorle } else { 1958b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one)); 196a5ce6ee0Svictorle } 197a3fa217bSJose E. Roman ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr); 1980450473dSBarry Smith ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr); 1993a40ed3dSBarry Smith PetscFunctionReturn(0); 2001987afe7SBarry Smith } 2011987afe7SBarry Smith 202e0877f53SBarry Smith static PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 203289bc588SBarry Smith { 204d0f46423SBarry Smith PetscInt N = A->rmap->n*A->cmap->n; 2053a40ed3dSBarry Smith 2063a40ed3dSBarry Smith PetscFunctionBegin; 2074e220ebcSLois Curfman McInnes info->block_size = 1.0; 2084e220ebcSLois Curfman McInnes info->nz_allocated = (double)N; 2096de62eeeSBarry Smith info->nz_used = (double)N; 2106de62eeeSBarry Smith info->nz_unneeded = (double)0; 2114e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 2124e220ebcSLois Curfman McInnes info->mallocs = 0; 2137adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 2144e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 2154e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 2164e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 2173a40ed3dSBarry Smith PetscFunctionReturn(0); 218289bc588SBarry Smith } 219289bc588SBarry Smith 220e0877f53SBarry Smith static PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 22180cd9d93SLois Curfman McInnes { 222273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 223f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 224efee365bSSatish Balay PetscErrorCode ierr; 225c5df96a5SBarry Smith PetscBLASInt one = 1,j,nz,lda; 22680cd9d93SLois Curfman McInnes 2273a40ed3dSBarry Smith PetscFunctionBegin; 228c5df96a5SBarry Smith ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr); 229d0f46423SBarry Smith if (lda>A->rmap->n) { 230c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr); 231d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 2328b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one)); 233a5ce6ee0Svictorle } 234a5ce6ee0Svictorle } else { 235c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr); 2368b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one)); 237a5ce6ee0Svictorle } 238efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 2393a40ed3dSBarry Smith PetscFunctionReturn(0); 24080cd9d93SLois Curfman McInnes } 24180cd9d93SLois Curfman McInnes 242e0877f53SBarry Smith static PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 2431cbb95d3SBarry Smith { 2441cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 245d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,N; 2461cbb95d3SBarry Smith PetscScalar *v = a->v; 2471cbb95d3SBarry Smith 2481cbb95d3SBarry Smith PetscFunctionBegin; 2491cbb95d3SBarry Smith *fl = PETSC_FALSE; 250d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 2511cbb95d3SBarry Smith N = a->lda; 2521cbb95d3SBarry Smith 2531cbb95d3SBarry Smith for (i=0; i<m; i++) { 2541cbb95d3SBarry Smith for (j=i+1; j<m; j++) { 2551cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 2561cbb95d3SBarry Smith } 2571cbb95d3SBarry Smith } 2581cbb95d3SBarry Smith *fl = PETSC_TRUE; 2591cbb95d3SBarry Smith PetscFunctionReturn(0); 2601cbb95d3SBarry Smith } 2611cbb95d3SBarry Smith 262e0877f53SBarry Smith static PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 263b24902e0SBarry Smith { 264b24902e0SBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 265b24902e0SBarry Smith PetscErrorCode ierr; 266b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 267b24902e0SBarry Smith 268b24902e0SBarry Smith PetscFunctionBegin; 269aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr); 270aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr); 2710298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr); 272b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 273b24902e0SBarry Smith l = (Mat_SeqDense*)newi->data; 274d0f46423SBarry Smith if (lda>A->rmap->n) { 275d0f46423SBarry Smith m = A->rmap->n; 276d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 277b24902e0SBarry Smith ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 278b24902e0SBarry Smith } 279b24902e0SBarry Smith } else { 280d0f46423SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 281b24902e0SBarry Smith } 282b24902e0SBarry Smith } 283b24902e0SBarry Smith newi->assembled = PETSC_TRUE; 284b24902e0SBarry Smith PetscFunctionReturn(0); 285b24902e0SBarry Smith } 286b24902e0SBarry Smith 287e0877f53SBarry Smith static PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 28802cad45dSBarry Smith { 2896849ba73SBarry Smith PetscErrorCode ierr; 29002cad45dSBarry Smith 2913a40ed3dSBarry Smith PetscFunctionBegin; 292ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr); 293d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 2945c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 295719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 296b24902e0SBarry Smith PetscFunctionReturn(0); 297b24902e0SBarry Smith } 298b24902e0SBarry Smith 2996ee01492SSatish Balay 300e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*); 301719d5645SBarry Smith 302e0877f53SBarry Smith static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 303289bc588SBarry Smith { 3044482741eSBarry Smith MatFactorInfo info; 305a093e273SMatthew Knepley PetscErrorCode ierr; 3063a40ed3dSBarry Smith 3073a40ed3dSBarry Smith PetscFunctionBegin; 308c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 309719d5645SBarry Smith ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr); 3103a40ed3dSBarry Smith PetscFunctionReturn(0); 311289bc588SBarry Smith } 3126ee01492SSatish Balay 313e0877f53SBarry Smith static PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 314289bc588SBarry Smith { 315c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 3166849ba73SBarry Smith PetscErrorCode ierr; 317f1ceaac6SMatthew G. Knepley const PetscScalar *x; 318f1ceaac6SMatthew G. Knepley PetscScalar *y; 319c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 32067e560aaSBarry Smith 3213a40ed3dSBarry Smith PetscFunctionBegin; 322c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 323f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 3241ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 325d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 326d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 327ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 328e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 329ae7cfcebSSatish Balay #else 3308b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 331e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 332ae7cfcebSSatish Balay #endif 333d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 334ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 335e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 336ae7cfcebSSatish Balay #else 3378b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 338e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 339ae7cfcebSSatish Balay #endif 3402205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 341f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 3421ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 343dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 3443a40ed3dSBarry Smith PetscFunctionReturn(0); 345289bc588SBarry Smith } 3466ee01492SSatish Balay 347e0877f53SBarry Smith static PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 34885e2c93fSHong Zhang { 34985e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 35085e2c93fSHong Zhang PetscErrorCode ierr; 35185e2c93fSHong Zhang PetscScalar *b,*x; 352efb80c78SLisandro Dalcin PetscInt n; 353783b601eSJed Brown PetscBLASInt nrhs,info,m; 354bda8bf91SBarry Smith PetscBool flg; 35585e2c93fSHong Zhang 35685e2c93fSHong Zhang PetscFunctionBegin; 357c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 3580298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 359ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix"); 3600298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 361ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix"); 362bda8bf91SBarry Smith 3630298fd71SBarry Smith ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr); 364c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr); 3658c778c55SBarry Smith ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr); 3668c778c55SBarry Smith ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr); 36785e2c93fSHong Zhang 368f272c775SHong Zhang ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr); 36985e2c93fSHong Zhang 37085e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 37185e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS) 37285e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 37385e2c93fSHong Zhang #else 3748b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 37585e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 37685e2c93fSHong Zhang #endif 37785e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 37885e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS) 37985e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 38085e2c93fSHong Zhang #else 3818b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info)); 38285e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 38385e2c93fSHong Zhang #endif 3842205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 38585e2c93fSHong Zhang 3868c778c55SBarry Smith ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr); 3878c778c55SBarry Smith ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr); 38885e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 38985e2c93fSHong Zhang PetscFunctionReturn(0); 39085e2c93fSHong Zhang } 39185e2c93fSHong Zhang 392e0877f53SBarry Smith static PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 393da3a660dSBarry Smith { 394c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 395dfbe8321SBarry Smith PetscErrorCode ierr; 396f1ceaac6SMatthew G. Knepley const PetscScalar *x; 397f1ceaac6SMatthew G. Knepley PetscScalar *y; 398c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 39967e560aaSBarry Smith 4003a40ed3dSBarry Smith PetscFunctionBegin; 401c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 402f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4031ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 404d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 405752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 406da3a660dSBarry Smith if (mat->pivots) { 407ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 408e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 409ae7cfcebSSatish Balay #else 4108b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 411e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 412ae7cfcebSSatish Balay #endif 4137a97a34bSBarry Smith } else { 414ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 415e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 416ae7cfcebSSatish Balay #else 4178b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 418e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 419ae7cfcebSSatish Balay #endif 420da3a660dSBarry Smith } 421f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4221ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 423dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 4243a40ed3dSBarry Smith PetscFunctionReturn(0); 425da3a660dSBarry Smith } 4266ee01492SSatish Balay 427e0877f53SBarry Smith static PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 428da3a660dSBarry Smith { 429c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 430dfbe8321SBarry Smith PetscErrorCode ierr; 431f1ceaac6SMatthew G. Knepley const PetscScalar *x; 432f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 433da3a660dSBarry Smith Vec tmp = 0; 434c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 43567e560aaSBarry Smith 4363a40ed3dSBarry Smith PetscFunctionBegin; 437c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 438f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4391ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 440d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 441da3a660dSBarry Smith if (yy == zz) { 44278b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 4433bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 44478b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 445da3a660dSBarry Smith } 446d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 447752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 448da3a660dSBarry Smith if (mat->pivots) { 449ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 450e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 451ae7cfcebSSatish Balay #else 4528b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 453e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 454ae7cfcebSSatish Balay #endif 455a8c6a408SBarry Smith } else { 456ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 457e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 458ae7cfcebSSatish Balay #else 4598b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 460e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 461ae7cfcebSSatish Balay #endif 462da3a660dSBarry Smith } 4636bf464f9SBarry Smith if (tmp) { 4646bf464f9SBarry Smith ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 4656bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 4666bf464f9SBarry Smith } else { 4676bf464f9SBarry Smith ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 4686bf464f9SBarry Smith } 469f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4701ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 471dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 4723a40ed3dSBarry Smith PetscFunctionReturn(0); 473da3a660dSBarry Smith } 47467e560aaSBarry Smith 475e0877f53SBarry Smith static PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 476da3a660dSBarry Smith { 477c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 4786849ba73SBarry Smith PetscErrorCode ierr; 479f1ceaac6SMatthew G. Knepley const PetscScalar *x; 480f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 48189ae1891SBarry Smith Vec tmp = NULL; 482c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 48367e560aaSBarry Smith 4843a40ed3dSBarry Smith PetscFunctionBegin; 485c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 486d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 487f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4881ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 489da3a660dSBarry Smith if (yy == zz) { 49078b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 4913bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 49278b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 493da3a660dSBarry Smith } 494d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 495752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 496da3a660dSBarry Smith if (mat->pivots) { 497ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 498e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 499ae7cfcebSSatish Balay #else 5008b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 501e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 502ae7cfcebSSatish Balay #endif 5033a40ed3dSBarry Smith } else { 504ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 505e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 506ae7cfcebSSatish Balay #else 5078b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 508e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 509ae7cfcebSSatish Balay #endif 510da3a660dSBarry Smith } 51190f02eecSBarry Smith if (tmp) { 5122dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 5136bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 5143a40ed3dSBarry Smith } else { 5152dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 51690f02eecSBarry Smith } 517f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 5181ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 519dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 5203a40ed3dSBarry Smith PetscFunctionReturn(0); 521da3a660dSBarry Smith } 522db4efbfdSBarry Smith 523db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 524db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 525db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 526e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 527db4efbfdSBarry Smith { 528db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 529db4efbfdSBarry Smith PetscFunctionBegin; 530e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 531db4efbfdSBarry Smith #else 532db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 533db4efbfdSBarry Smith PetscErrorCode ierr; 534db4efbfdSBarry Smith PetscBLASInt n,m,info; 535db4efbfdSBarry Smith 536db4efbfdSBarry Smith PetscFunctionBegin; 537c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 538c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 539db4efbfdSBarry Smith if (!mat->pivots) { 540854ce69bSBarry Smith ierr = PetscMalloc1(A->rmap->n+1,&mat->pivots);CHKERRQ(ierr); 5413bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 542db4efbfdSBarry Smith } 543db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5448e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5458b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info)); 5468e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 5478e57ea43SSatish Balay 548e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 549e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 550db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 551db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 552db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 553db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 554d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 555db4efbfdSBarry Smith 556f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 557f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 558f6224b95SHong Zhang 559dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 560db4efbfdSBarry Smith #endif 561db4efbfdSBarry Smith PetscFunctionReturn(0); 562db4efbfdSBarry Smith } 563db4efbfdSBarry Smith 564e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 565db4efbfdSBarry Smith { 566db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 567db4efbfdSBarry Smith PetscFunctionBegin; 568e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 569db4efbfdSBarry Smith #else 570db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 571db4efbfdSBarry Smith PetscErrorCode ierr; 572c5df96a5SBarry Smith PetscBLASInt info,n; 573db4efbfdSBarry Smith 574db4efbfdSBarry Smith PetscFunctionBegin; 575c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 576db4efbfdSBarry Smith ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 577db4efbfdSBarry Smith 578db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5798b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info)); 580e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 581db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 582db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 583db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 584db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 585d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 5862205254eSKarl Rupp 587f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 588f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 589f6224b95SHong Zhang 590eb3f19e4SBarry Smith ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 591db4efbfdSBarry Smith #endif 592db4efbfdSBarry Smith PetscFunctionReturn(0); 593db4efbfdSBarry Smith } 594db4efbfdSBarry Smith 595db4efbfdSBarry Smith 5960481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 597db4efbfdSBarry Smith { 598db4efbfdSBarry Smith PetscErrorCode ierr; 599db4efbfdSBarry Smith MatFactorInfo info; 600db4efbfdSBarry Smith 601db4efbfdSBarry Smith PetscFunctionBegin; 602db4efbfdSBarry Smith info.fill = 1.0; 6032205254eSKarl Rupp 604c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 605719d5645SBarry Smith ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr); 606db4efbfdSBarry Smith PetscFunctionReturn(0); 607db4efbfdSBarry Smith } 608db4efbfdSBarry Smith 609e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 610db4efbfdSBarry Smith { 611db4efbfdSBarry Smith PetscFunctionBegin; 612c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 6131bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 614719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 615db4efbfdSBarry Smith PetscFunctionReturn(0); 616db4efbfdSBarry Smith } 617db4efbfdSBarry Smith 618e0877f53SBarry Smith static PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 619db4efbfdSBarry Smith { 620db4efbfdSBarry Smith PetscFunctionBegin; 621b66fe19dSMatthew G Knepley fact->preallocated = PETSC_TRUE; 622c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 623719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 624db4efbfdSBarry Smith PetscFunctionReturn(0); 625db4efbfdSBarry Smith } 626db4efbfdSBarry Smith 627cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 628db4efbfdSBarry Smith { 629db4efbfdSBarry Smith PetscErrorCode ierr; 630db4efbfdSBarry Smith 631db4efbfdSBarry Smith PetscFunctionBegin; 632ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr); 633db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 634db4efbfdSBarry Smith ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr); 635db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU) { 636db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 637db4efbfdSBarry Smith } else { 638db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 639db4efbfdSBarry Smith } 640d5f3da31SBarry Smith (*fact)->factortype = ftype; 64100c67f3bSHong Zhang 64200c67f3bSHong Zhang ierr = PetscFree((*fact)->solvertype);CHKERRQ(ierr); 64300c67f3bSHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype);CHKERRQ(ierr); 644db4efbfdSBarry Smith PetscFunctionReturn(0); 645db4efbfdSBarry Smith } 646db4efbfdSBarry Smith 647289bc588SBarry Smith /* ------------------------------------------------------------------*/ 648e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 649289bc588SBarry Smith { 650c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 651d9ca1df4SBarry Smith PetscScalar *x,*v = mat->v,zero = 0.0,xt; 652d9ca1df4SBarry Smith const PetscScalar *b; 653dfbe8321SBarry Smith PetscErrorCode ierr; 654d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 655c5df96a5SBarry Smith PetscBLASInt o = 1,bm; 656289bc588SBarry Smith 6573a40ed3dSBarry Smith PetscFunctionBegin; 658422a814eSBarry Smith if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */ 659c5df96a5SBarry Smith ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr); 660289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 66171044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 6622dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 663289bc588SBarry Smith } 6641ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 665d9ca1df4SBarry Smith ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr); 666b965ef7fSBarry Smith its = its*lits; 667e32f2f54SBarry 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); 668289bc588SBarry Smith while (its--) { 669fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 670289bc588SBarry Smith for (i=0; i<m; i++) { 6718b83055fSJed Brown PetscStackCallBLAS("BLASdot",xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o)); 67255a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 673289bc588SBarry Smith } 674289bc588SBarry Smith } 675fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 676289bc588SBarry Smith for (i=m-1; i>=0; i--) { 6778b83055fSJed Brown PetscStackCallBLAS("BLASdot",xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o)); 67855a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 679289bc588SBarry Smith } 680289bc588SBarry Smith } 681289bc588SBarry Smith } 682d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr); 6831ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 6843a40ed3dSBarry Smith PetscFunctionReturn(0); 685289bc588SBarry Smith } 686289bc588SBarry Smith 687289bc588SBarry Smith /* -----------------------------------------------------------------*/ 688cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 689289bc588SBarry Smith { 690c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 691d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 692d9ca1df4SBarry Smith PetscScalar *y; 693dfbe8321SBarry Smith PetscErrorCode ierr; 6940805154bSBarry Smith PetscBLASInt m, n,_One=1; 695ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 6963a40ed3dSBarry Smith 6973a40ed3dSBarry Smith PetscFunctionBegin; 698c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 699c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 700d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 701d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 7021ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 7038b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One)); 704d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 7051ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 706dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 7073a40ed3dSBarry Smith PetscFunctionReturn(0); 708289bc588SBarry Smith } 709800995b7SMatthew Knepley 710cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 711289bc588SBarry Smith { 712c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 713d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0,_DZero=0.0; 714dfbe8321SBarry Smith PetscErrorCode ierr; 7150805154bSBarry Smith PetscBLASInt m, n, _One=1; 716d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 7173a40ed3dSBarry Smith 7183a40ed3dSBarry Smith PetscFunctionBegin; 719c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 720c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 721d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 722d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 7231ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 7248b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One)); 725d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 7261ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 727dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 7283a40ed3dSBarry Smith PetscFunctionReturn(0); 729289bc588SBarry Smith } 7306ee01492SSatish Balay 731cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 732289bc588SBarry Smith { 733c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 734d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 735d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0; 736dfbe8321SBarry Smith PetscErrorCode ierr; 7370805154bSBarry Smith PetscBLASInt m, n, _One=1; 7383a40ed3dSBarry Smith 7393a40ed3dSBarry Smith PetscFunctionBegin; 740c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 741c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 742d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 743600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 744d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 7451ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 7468b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 747d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 7481ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 749dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 7503a40ed3dSBarry Smith PetscFunctionReturn(0); 751289bc588SBarry Smith } 7526ee01492SSatish Balay 753e0877f53SBarry Smith static PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 754289bc588SBarry Smith { 755c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 756d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 757d9ca1df4SBarry Smith PetscScalar *y; 758dfbe8321SBarry Smith PetscErrorCode ierr; 7590805154bSBarry Smith PetscBLASInt m, n, _One=1; 76087828ca2SBarry Smith PetscScalar _DOne=1.0; 7613a40ed3dSBarry Smith 7623a40ed3dSBarry Smith PetscFunctionBegin; 763c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 764c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 765d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 766600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 767d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 7681ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 7698b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 770d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 7711ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 772dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 7733a40ed3dSBarry Smith PetscFunctionReturn(0); 774289bc588SBarry Smith } 775289bc588SBarry Smith 776289bc588SBarry Smith /* -----------------------------------------------------------------*/ 777e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 778289bc588SBarry Smith { 779c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 78087828ca2SBarry Smith PetscScalar *v; 7816849ba73SBarry Smith PetscErrorCode ierr; 78213f74950SBarry Smith PetscInt i; 78367e560aaSBarry Smith 7843a40ed3dSBarry Smith PetscFunctionBegin; 785d0f46423SBarry Smith *ncols = A->cmap->n; 786289bc588SBarry Smith if (cols) { 787854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr); 788d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 789289bc588SBarry Smith } 790289bc588SBarry Smith if (vals) { 791854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr); 792289bc588SBarry Smith v = mat->v + row; 793d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 794289bc588SBarry Smith } 7953a40ed3dSBarry Smith PetscFunctionReturn(0); 796289bc588SBarry Smith } 7976ee01492SSatish Balay 798e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 799289bc588SBarry Smith { 800dfbe8321SBarry Smith PetscErrorCode ierr; 8016e111a19SKarl Rupp 802606d414cSSatish Balay PetscFunctionBegin; 803606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 804606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 8053a40ed3dSBarry Smith PetscFunctionReturn(0); 806289bc588SBarry Smith } 807289bc588SBarry Smith /* ----------------------------------------------------------------*/ 808e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 809289bc588SBarry Smith { 810c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 81113f74950SBarry Smith PetscInt i,j,idx=0; 812d6dfbf8fSBarry Smith 8133a40ed3dSBarry Smith PetscFunctionBegin; 814289bc588SBarry Smith if (!mat->roworiented) { 815dbb450caSBarry Smith if (addv == INSERT_VALUES) { 816289bc588SBarry Smith for (j=0; j<n; j++) { 817cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 8182515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 819e32f2f54SBarry 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); 82058804f6dSBarry Smith #endif 821289bc588SBarry Smith for (i=0; i<m; i++) { 822cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 8232515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 824e32f2f54SBarry 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); 82558804f6dSBarry Smith #endif 826cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 827289bc588SBarry Smith } 828289bc588SBarry Smith } 8293a40ed3dSBarry Smith } else { 830289bc588SBarry Smith for (j=0; j<n; j++) { 831cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 8322515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 833e32f2f54SBarry 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); 83458804f6dSBarry Smith #endif 835289bc588SBarry Smith for (i=0; i<m; i++) { 836cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 8372515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 838e32f2f54SBarry 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); 83958804f6dSBarry Smith #endif 840cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 841289bc588SBarry Smith } 842289bc588SBarry Smith } 843289bc588SBarry Smith } 8443a40ed3dSBarry Smith } else { 845dbb450caSBarry Smith if (addv == INSERT_VALUES) { 846e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 847cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 8482515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 849e32f2f54SBarry 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); 85058804f6dSBarry Smith #endif 851e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 852cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 8532515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 854e32f2f54SBarry 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); 85558804f6dSBarry Smith #endif 856cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 857e8d4e0b9SBarry Smith } 858e8d4e0b9SBarry Smith } 8593a40ed3dSBarry Smith } else { 860289bc588SBarry Smith for (i=0; i<m; i++) { 861cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 8622515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 863e32f2f54SBarry 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); 86458804f6dSBarry Smith #endif 865289bc588SBarry Smith for (j=0; j<n; j++) { 866cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 8672515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 868e32f2f54SBarry 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); 86958804f6dSBarry Smith #endif 870cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 871289bc588SBarry Smith } 872289bc588SBarry Smith } 873289bc588SBarry Smith } 874e8d4e0b9SBarry Smith } 8753a40ed3dSBarry Smith PetscFunctionReturn(0); 876289bc588SBarry Smith } 877e8d4e0b9SBarry Smith 878e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 879ae80bb75SLois Curfman McInnes { 880ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 88113f74950SBarry Smith PetscInt i,j; 882ae80bb75SLois Curfman McInnes 8833a40ed3dSBarry Smith PetscFunctionBegin; 884ae80bb75SLois Curfman McInnes /* row-oriented output */ 885ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 88697e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 887e32f2f54SBarry Smith if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested larger than number rows %D",indexm[i],A->rmap->n); 888ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 8896f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 890e32f2f54SBarry Smith if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column %D requested larger than number columns %D",indexn[j],A->cmap->n); 89197e567efSBarry Smith *v++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 892ae80bb75SLois Curfman McInnes } 893ae80bb75SLois Curfman McInnes } 8943a40ed3dSBarry Smith PetscFunctionReturn(0); 895ae80bb75SLois Curfman McInnes } 896ae80bb75SLois Curfman McInnes 897289bc588SBarry Smith /* -----------------------------------------------------------------*/ 898289bc588SBarry Smith 899e0877f53SBarry Smith static PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer) 900aabbc4fbSShri Abhyankar { 901aabbc4fbSShri Abhyankar Mat_SeqDense *a; 902aabbc4fbSShri Abhyankar PetscErrorCode ierr; 903aabbc4fbSShri Abhyankar PetscInt *scols,i,j,nz,header[4]; 904aabbc4fbSShri Abhyankar int fd; 905aabbc4fbSShri Abhyankar PetscMPIInt size; 906aabbc4fbSShri Abhyankar PetscInt *rowlengths = 0,M,N,*cols,grows,gcols; 907aabbc4fbSShri Abhyankar PetscScalar *vals,*svals,*v,*w; 908ce94432eSBarry Smith MPI_Comm comm; 909aabbc4fbSShri Abhyankar 910aabbc4fbSShri Abhyankar PetscFunctionBegin; 911c98fd787SBarry Smith /* force binary viewer to load .info file if it has not yet done so */ 912c98fd787SBarry Smith ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 913ce94432eSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 914aabbc4fbSShri Abhyankar ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 915aabbc4fbSShri Abhyankar if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor"); 916aabbc4fbSShri Abhyankar ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 917aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 918aabbc4fbSShri Abhyankar if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 919aabbc4fbSShri Abhyankar M = header[1]; N = header[2]; nz = header[3]; 920aabbc4fbSShri Abhyankar 921aabbc4fbSShri Abhyankar /* set global size if not set already*/ 922aabbc4fbSShri Abhyankar if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) { 923aabbc4fbSShri Abhyankar ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr); 924aabbc4fbSShri Abhyankar } else { 925aabbc4fbSShri Abhyankar /* if sizes and type are already set, check if the vector global sizes are correct */ 926aabbc4fbSShri Abhyankar ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr); 927aabbc4fbSShri 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); 928aabbc4fbSShri Abhyankar } 929e6324fbbSBarry Smith a = (Mat_SeqDense*)newmat->data; 930e6324fbbSBarry Smith if (!a->user_alloc) { 9310298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 932e6324fbbSBarry Smith } 933aabbc4fbSShri Abhyankar 934aabbc4fbSShri Abhyankar if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 935aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 936aabbc4fbSShri Abhyankar v = a->v; 937aabbc4fbSShri Abhyankar /* Allocate some temp space to read in the values and then flip them 938aabbc4fbSShri Abhyankar from row major to column major */ 939854ce69bSBarry Smith ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr); 940aabbc4fbSShri Abhyankar /* read in nonzero values */ 941aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 942aabbc4fbSShri Abhyankar /* now flip the values and store them in the matrix*/ 943aabbc4fbSShri Abhyankar for (j=0; j<N; j++) { 944aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 945aabbc4fbSShri Abhyankar *v++ =w[i*N+j]; 946aabbc4fbSShri Abhyankar } 947aabbc4fbSShri Abhyankar } 948aabbc4fbSShri Abhyankar ierr = PetscFree(w);CHKERRQ(ierr); 949aabbc4fbSShri Abhyankar } else { 950aabbc4fbSShri Abhyankar /* read row lengths */ 951854ce69bSBarry Smith ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr); 952aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 953aabbc4fbSShri Abhyankar 954aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 955aabbc4fbSShri Abhyankar v = a->v; 956aabbc4fbSShri Abhyankar 957aabbc4fbSShri Abhyankar /* read column indices and nonzeros */ 958854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr); 959aabbc4fbSShri Abhyankar cols = scols; 960aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 961854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr); 962aabbc4fbSShri Abhyankar vals = svals; 963aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 964aabbc4fbSShri Abhyankar 965aabbc4fbSShri Abhyankar /* insert into matrix */ 966aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 967aabbc4fbSShri Abhyankar for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 968aabbc4fbSShri Abhyankar svals += rowlengths[i]; scols += rowlengths[i]; 969aabbc4fbSShri Abhyankar } 970aabbc4fbSShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 971aabbc4fbSShri Abhyankar ierr = PetscFree(cols);CHKERRQ(ierr); 972aabbc4fbSShri Abhyankar ierr = PetscFree(rowlengths);CHKERRQ(ierr); 973aabbc4fbSShri Abhyankar } 974aabbc4fbSShri Abhyankar ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 975aabbc4fbSShri Abhyankar ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 976aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 977aabbc4fbSShri Abhyankar } 978aabbc4fbSShri Abhyankar 9796849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 980289bc588SBarry Smith { 981932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 982dfbe8321SBarry Smith PetscErrorCode ierr; 98313f74950SBarry Smith PetscInt i,j; 9842dcb1b2aSMatthew Knepley const char *name; 98587828ca2SBarry Smith PetscScalar *v; 986f3ef73ceSBarry Smith PetscViewerFormat format; 9875f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 988ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 9895f481a85SSatish Balay #endif 990932b0c3eSLois Curfman McInnes 9913a40ed3dSBarry Smith PetscFunctionBegin; 992b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 993456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 9943a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 995fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 996d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 997d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 99844cd7ae7SLois Curfman McInnes v = a->v + i; 99977431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 1000d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1001aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1002329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 100357622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 1004329f5518SBarry Smith } else if (PetscRealPart(*v)) { 100557622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr); 10066831982aSBarry Smith } 100780cd9d93SLois Curfman McInnes #else 10086831982aSBarry Smith if (*v) { 100957622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr); 10106831982aSBarry Smith } 101180cd9d93SLois Curfman McInnes #endif 10121b807ce4Svictorle v += a->lda; 101380cd9d93SLois Curfman McInnes } 1014b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 101580cd9d93SLois Curfman McInnes } 1016d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 10173a40ed3dSBarry Smith } else { 1018d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1019aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 102047989497SBarry Smith /* determine if matrix has all real values */ 102147989497SBarry Smith v = a->v; 1022d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 1023ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;} 102447989497SBarry Smith } 102547989497SBarry Smith #endif 1026fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 10273a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 1028d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1029d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1030fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 1031ffac6cdbSBarry Smith } 1032ffac6cdbSBarry Smith 1033d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1034932b0c3eSLois Curfman McInnes v = a->v + i; 1035d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1036aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 103747989497SBarry Smith if (allreal) { 1038c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr); 103947989497SBarry Smith } else { 1040c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 104147989497SBarry Smith } 1042289bc588SBarry Smith #else 1043c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr); 1044289bc588SBarry Smith #endif 10451b807ce4Svictorle v += a->lda; 1046289bc588SBarry Smith } 1047b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 1048289bc588SBarry Smith } 1049fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 1050b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 1051ffac6cdbSBarry Smith } 1052d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 1053da3a660dSBarry Smith } 1054b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 10553a40ed3dSBarry Smith PetscFunctionReturn(0); 1056289bc588SBarry Smith } 1057289bc588SBarry Smith 10586849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 1059932b0c3eSLois Curfman McInnes { 1060932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 10616849ba73SBarry Smith PetscErrorCode ierr; 106213f74950SBarry Smith int fd; 1063d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 1064f4403165SShri Abhyankar PetscScalar *v,*anonz,*vals; 1065f4403165SShri Abhyankar PetscViewerFormat format; 1066932b0c3eSLois Curfman McInnes 10673a40ed3dSBarry Smith PetscFunctionBegin; 1068b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 106990ace30eSBarry Smith 1070f4403165SShri Abhyankar ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1071f4403165SShri Abhyankar if (format == PETSC_VIEWER_NATIVE) { 1072f4403165SShri Abhyankar /* store the matrix as a dense matrix */ 1073785e854fSJed Brown ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr); 10742205254eSKarl Rupp 1075f4403165SShri Abhyankar col_lens[0] = MAT_FILE_CLASSID; 1076f4403165SShri Abhyankar col_lens[1] = m; 1077f4403165SShri Abhyankar col_lens[2] = n; 1078f4403165SShri Abhyankar col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 10792205254eSKarl Rupp 1080f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1081f4403165SShri Abhyankar ierr = PetscFree(col_lens);CHKERRQ(ierr); 1082f4403165SShri Abhyankar 1083f4403165SShri Abhyankar /* write out matrix, by rows */ 1084854ce69bSBarry Smith ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr); 1085f4403165SShri Abhyankar v = a->v; 1086f4403165SShri Abhyankar for (j=0; j<n; j++) { 1087f4403165SShri Abhyankar for (i=0; i<m; i++) { 1088f4403165SShri Abhyankar vals[j + i*n] = *v++; 1089f4403165SShri Abhyankar } 1090f4403165SShri Abhyankar } 1091f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1092f4403165SShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1093f4403165SShri Abhyankar } else { 1094854ce69bSBarry Smith ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr); 10952205254eSKarl Rupp 10960700a824SBarry Smith col_lens[0] = MAT_FILE_CLASSID; 1097932b0c3eSLois Curfman McInnes col_lens[1] = m; 1098932b0c3eSLois Curfman McInnes col_lens[2] = n; 1099932b0c3eSLois Curfman McInnes col_lens[3] = nz; 1100932b0c3eSLois Curfman McInnes 1101932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 1102932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 11036f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1104932b0c3eSLois Curfman McInnes 1105932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 1106932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 1107932b0c3eSLois Curfman McInnes ict = 0; 1108932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1109932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 1110932b0c3eSLois Curfman McInnes } 11116f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 1112606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 1113932b0c3eSLois Curfman McInnes 1114932b0c3eSLois Curfman McInnes /* store nonzero values */ 1115854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr); 1116932b0c3eSLois Curfman McInnes ict = 0; 1117932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1118932b0c3eSLois Curfman McInnes v = a->v + i; 1119932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 11201b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 1121932b0c3eSLois Curfman McInnes } 1122932b0c3eSLois Curfman McInnes } 11236f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1124606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 1125f4403165SShri Abhyankar } 11263a40ed3dSBarry Smith PetscFunctionReturn(0); 1127932b0c3eSLois Curfman McInnes } 1128932b0c3eSLois Curfman McInnes 11299804daf3SBarry Smith #include <petscdraw.h> 1130e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1131f1af5d2fSBarry Smith { 1132f1af5d2fSBarry Smith Mat A = (Mat) Aa; 1133f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 11346849ba73SBarry Smith PetscErrorCode ierr; 1135383922c3SLisandro Dalcin PetscInt m = A->rmap->n,n = A->cmap->n,i,j; 1136383922c3SLisandro Dalcin int color = PETSC_DRAW_WHITE; 113787828ca2SBarry Smith PetscScalar *v = a->v; 1138b0a32e0cSBarry Smith PetscViewer viewer; 1139b05fc000SLisandro Dalcin PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r; 1140f3ef73ceSBarry Smith PetscViewerFormat format; 1141f1af5d2fSBarry Smith 1142f1af5d2fSBarry Smith PetscFunctionBegin; 1143f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1144b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1145b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1146f1af5d2fSBarry Smith 1147f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1148383922c3SLisandro Dalcin 1149fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1150383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1151f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1152f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1153383922c3SLisandro Dalcin x_l = j; x_r = x_l + 1.0; 1154f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1155f1af5d2fSBarry Smith y_l = m - i - 1.0; 1156f1af5d2fSBarry Smith y_r = y_l + 1.0; 1157329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1158b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1159329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1160b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1161f1af5d2fSBarry Smith } else { 1162f1af5d2fSBarry Smith continue; 1163f1af5d2fSBarry Smith } 1164b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1165f1af5d2fSBarry Smith } 1166f1af5d2fSBarry Smith } 1167383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1168f1af5d2fSBarry Smith } else { 1169f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1170f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1171b05fc000SLisandro Dalcin PetscReal minv = 0.0, maxv = 0.0; 1172b05fc000SLisandro Dalcin PetscDraw popup; 1173b05fc000SLisandro Dalcin 1174f1af5d2fSBarry Smith for (i=0; i < m*n; i++) { 1175f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1176f1af5d2fSBarry Smith } 1177383922c3SLisandro Dalcin if (minv >= maxv) maxv = minv + PETSC_SMALL; 1178b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 117945f3bb6eSLisandro Dalcin ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr); 1180383922c3SLisandro Dalcin 1181383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1182f1af5d2fSBarry Smith for (j=0; j<n; j++) { 1183f1af5d2fSBarry Smith x_l = j; 1184f1af5d2fSBarry Smith x_r = x_l + 1.0; 1185f1af5d2fSBarry Smith for (i=0; i<m; i++) { 1186f1af5d2fSBarry Smith y_l = m - i - 1.0; 1187f1af5d2fSBarry Smith y_r = y_l + 1.0; 1188b05fc000SLisandro Dalcin color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv); 1189b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1190f1af5d2fSBarry Smith } 1191f1af5d2fSBarry Smith } 1192383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1193f1af5d2fSBarry Smith } 1194f1af5d2fSBarry Smith PetscFunctionReturn(0); 1195f1af5d2fSBarry Smith } 1196f1af5d2fSBarry Smith 1197e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1198f1af5d2fSBarry Smith { 1199b0a32e0cSBarry Smith PetscDraw draw; 1200ace3abfcSBarry Smith PetscBool isnull; 1201329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1202dfbe8321SBarry Smith PetscErrorCode ierr; 1203f1af5d2fSBarry Smith 1204f1af5d2fSBarry Smith PetscFunctionBegin; 1205b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1206b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1207abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1208f1af5d2fSBarry Smith 1209d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1210f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1211b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1212832b7cebSLisandro Dalcin ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1213b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 12140298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1215832b7cebSLisandro Dalcin ierr = PetscDrawSave(draw);CHKERRQ(ierr); 1216f1af5d2fSBarry Smith PetscFunctionReturn(0); 1217f1af5d2fSBarry Smith } 1218f1af5d2fSBarry Smith 1219dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1220932b0c3eSLois Curfman McInnes { 1221dfbe8321SBarry Smith PetscErrorCode ierr; 1222ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1223932b0c3eSLois Curfman McInnes 12243a40ed3dSBarry Smith PetscFunctionBegin; 1225251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1226251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1227251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 12280f5bd95cSBarry Smith 1229c45a1595SBarry Smith if (iascii) { 1230c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 12310f5bd95cSBarry Smith } else if (isbinary) { 12323a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1233f1af5d2fSBarry Smith } else if (isdraw) { 1234f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1235932b0c3eSLois Curfman McInnes } 12363a40ed3dSBarry Smith PetscFunctionReturn(0); 1237932b0c3eSLois Curfman McInnes } 1238289bc588SBarry Smith 1239e0877f53SBarry Smith static PetscErrorCode MatDestroy_SeqDense(Mat mat) 1240289bc588SBarry Smith { 1241ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1242dfbe8321SBarry Smith PetscErrorCode ierr; 124390f02eecSBarry Smith 12443a40ed3dSBarry Smith PetscFunctionBegin; 1245aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1246d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1247a5a9c739SBarry Smith #endif 124805b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 1249abc3b08eSStefano Zampini ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr); 12506857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1251bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1252dbd8c25aSHong Zhang 1253dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1254bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 1255bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 12568baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 12578baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 12588baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 12598baccfbdSHong Zhang #endif 1260bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 1261bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1262bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1263bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1264abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12653bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12663bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12673bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 12683a40ed3dSBarry Smith PetscFunctionReturn(0); 1269289bc588SBarry Smith } 1270289bc588SBarry Smith 1271e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1272289bc588SBarry Smith { 1273c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 12746849ba73SBarry Smith PetscErrorCode ierr; 127513f74950SBarry Smith PetscInt k,j,m,n,M; 127687828ca2SBarry Smith PetscScalar *v,tmp; 127748b35521SBarry Smith 12783a40ed3dSBarry Smith PetscFunctionBegin; 1279d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 1280cf37664fSBarry Smith if (reuse == MAT_INPLACE_MATRIX) { /* in place transpose */ 1281e7e72b3dSBarry Smith if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1282e7e72b3dSBarry Smith else { 1283d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1284289bc588SBarry Smith for (k=0; k<j; k++) { 12851b807ce4Svictorle tmp = v[j + k*M]; 12861b807ce4Svictorle v[j + k*M] = v[k + j*M]; 12871b807ce4Svictorle v[k + j*M] = tmp; 1288289bc588SBarry Smith } 1289289bc588SBarry Smith } 1290d64ed03dSBarry Smith } 12913a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1292d3e5ee88SLois Curfman McInnes Mat tmat; 1293ec8511deSBarry Smith Mat_SeqDense *tmatd; 129487828ca2SBarry Smith PetscScalar *v2; 1295af36a384SStefano Zampini PetscInt M2; 1296ea709b57SSatish Balay 1297fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX) { 1298ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1299d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 13007adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 13010298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1302fc4dec0aSBarry Smith } else { 1303fc4dec0aSBarry Smith tmat = *matout; 1304fc4dec0aSBarry Smith } 1305ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 1306af36a384SStefano Zampini v = mat->v; v2 = tmatd->v; M2 = tmatd->lda; 1307d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 1308af36a384SStefano Zampini for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M]; 1309d3e5ee88SLois Curfman McInnes } 13106d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 13116d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1312d3e5ee88SLois Curfman McInnes *matout = tmat; 131348b35521SBarry Smith } 13143a40ed3dSBarry Smith PetscFunctionReturn(0); 1315289bc588SBarry Smith } 1316289bc588SBarry Smith 1317e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1318289bc588SBarry Smith { 1319c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1320c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 132113f74950SBarry Smith PetscInt i,j; 1322a2ea699eSBarry Smith PetscScalar *v1,*v2; 13239ea5d5aeSSatish Balay 13243a40ed3dSBarry Smith PetscFunctionBegin; 1325d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1326d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1327d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 13281b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1329d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 13303a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 13311b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 13321b807ce4Svictorle } 1333289bc588SBarry Smith } 133477c4ece6SBarry Smith *flg = PETSC_TRUE; 13353a40ed3dSBarry Smith PetscFunctionReturn(0); 1336289bc588SBarry Smith } 1337289bc588SBarry Smith 1338e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1339289bc588SBarry Smith { 1340c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1341dfbe8321SBarry Smith PetscErrorCode ierr; 134213f74950SBarry Smith PetscInt i,n,len; 134387828ca2SBarry Smith PetscScalar *x,zero = 0.0; 134444cd7ae7SLois Curfman McInnes 13453a40ed3dSBarry Smith PetscFunctionBegin; 13462dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 13477a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 13481ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1349d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1350e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 135144cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 13521b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1353289bc588SBarry Smith } 13541ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 13553a40ed3dSBarry Smith PetscFunctionReturn(0); 1356289bc588SBarry Smith } 1357289bc588SBarry Smith 1358e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1359289bc588SBarry Smith { 1360c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1361f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1362f1ceaac6SMatthew G. Knepley PetscScalar x,*v; 1363dfbe8321SBarry Smith PetscErrorCode ierr; 1364d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 136555659b69SBarry Smith 13663a40ed3dSBarry Smith PetscFunctionBegin; 136728988994SBarry Smith if (ll) { 13687a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 1369f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr); 1370e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1371da3a660dSBarry Smith for (i=0; i<m; i++) { 1372da3a660dSBarry Smith x = l[i]; 1373da3a660dSBarry Smith v = mat->v + i; 1374b43bac26SStefano Zampini for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;} 1375da3a660dSBarry Smith } 1376f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr); 1377eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1378da3a660dSBarry Smith } 137928988994SBarry Smith if (rr) { 13807a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 1381f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr); 1382e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1383da3a660dSBarry Smith for (i=0; i<n; i++) { 1384da3a660dSBarry Smith x = r[i]; 1385b43bac26SStefano Zampini v = mat->v + i*mat->lda; 13862205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1387da3a660dSBarry Smith } 1388f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr); 1389eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1390da3a660dSBarry Smith } 13913a40ed3dSBarry Smith PetscFunctionReturn(0); 1392289bc588SBarry Smith } 1393289bc588SBarry Smith 1394e0877f53SBarry Smith static PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1395289bc588SBarry Smith { 1396c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 139787828ca2SBarry Smith PetscScalar *v = mat->v; 1398329f5518SBarry Smith PetscReal sum = 0.0; 1399d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1400efee365bSSatish Balay PetscErrorCode ierr; 140155659b69SBarry Smith 14023a40ed3dSBarry Smith PetscFunctionBegin; 1403289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1404a5ce6ee0Svictorle if (lda>m) { 1405d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1406a5ce6ee0Svictorle v = mat->v+j*lda; 1407a5ce6ee0Svictorle for (i=0; i<m; i++) { 1408a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1409a5ce6ee0Svictorle } 1410a5ce6ee0Svictorle } 1411a5ce6ee0Svictorle } else { 1412570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FP16) 1413570b7f6dSBarry Smith PetscBLASInt one = 1,cnt = A->cmap->n*A->rmap->n; 1414570b7f6dSBarry Smith *nrm = BLASnrm2_(&cnt,v,&one); 1415570b7f6dSBarry Smith } 1416570b7f6dSBarry Smith #else 1417d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1418329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1419289bc588SBarry Smith } 1420a5ce6ee0Svictorle } 14218f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1422570b7f6dSBarry Smith #endif 1423dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 14243a40ed3dSBarry Smith } else if (type == NORM_1) { 1425064f8208SBarry Smith *nrm = 0.0; 1426d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 14271b807ce4Svictorle v = mat->v + j*mat->lda; 1428289bc588SBarry Smith sum = 0.0; 1429d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 143033a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1431289bc588SBarry Smith } 1432064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1433289bc588SBarry Smith } 1434eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 14353a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1436064f8208SBarry Smith *nrm = 0.0; 1437d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1438289bc588SBarry Smith v = mat->v + j; 1439289bc588SBarry Smith sum = 0.0; 1440d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 14411b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1442289bc588SBarry Smith } 1443064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1444289bc588SBarry Smith } 1445eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1446e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 14473a40ed3dSBarry Smith PetscFunctionReturn(0); 1448289bc588SBarry Smith } 1449289bc588SBarry Smith 1450e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1451289bc588SBarry Smith { 1452c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 145363ba0a88SBarry Smith PetscErrorCode ierr; 145467e560aaSBarry Smith 14553a40ed3dSBarry Smith PetscFunctionBegin; 1456b5a2b587SKris Buschelman switch (op) { 1457b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 14584e0d8c25SBarry Smith aij->roworiented = flg; 1459b5a2b587SKris Buschelman break; 1460512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1461b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 14623971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 14634e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 146413fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1465b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1466b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 1467*0f8fb01aSBarry Smith case MAT_IGNORE_ZERO_ENTRIES: 14685021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 14695021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 14705021d80fSJed Brown break; 14715021d80fSJed Brown case MAT_SPD: 147277e54ba9SKris Buschelman case MAT_SYMMETRIC: 147377e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 14749a4540c5SBarry Smith case MAT_HERMITIAN: 14759a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 14765021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 147777e54ba9SKris Buschelman break; 1478b5a2b587SKris Buschelman default: 1479e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 14803a40ed3dSBarry Smith } 14813a40ed3dSBarry Smith PetscFunctionReturn(0); 1482289bc588SBarry Smith } 1483289bc588SBarry Smith 1484e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A) 14856f0a148fSBarry Smith { 1486ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 14876849ba73SBarry Smith PetscErrorCode ierr; 1488d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 14893a40ed3dSBarry Smith 14903a40ed3dSBarry Smith PetscFunctionBegin; 1491a5ce6ee0Svictorle if (lda>m) { 1492d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1493a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1494a5ce6ee0Svictorle } 1495a5ce6ee0Svictorle } else { 1496d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1497a5ce6ee0Svictorle } 14983a40ed3dSBarry Smith PetscFunctionReturn(0); 14996f0a148fSBarry Smith } 15006f0a148fSBarry Smith 1501e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 15026f0a148fSBarry Smith { 150397b48c8fSBarry Smith PetscErrorCode ierr; 1504ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1505b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 150697b48c8fSBarry Smith PetscScalar *slot,*bb; 150797b48c8fSBarry Smith const PetscScalar *xx; 150855659b69SBarry Smith 15093a40ed3dSBarry Smith PetscFunctionBegin; 1510b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1511b9679d65SBarry Smith for (i=0; i<N; i++) { 1512b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1513b9679d65SBarry 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); 1514b9679d65SBarry Smith } 1515b9679d65SBarry Smith #endif 1516b9679d65SBarry Smith 151797b48c8fSBarry Smith /* fix right hand side if needed */ 151897b48c8fSBarry Smith if (x && b) { 151997b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 152097b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 15212205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 152297b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 152397b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 152497b48c8fSBarry Smith } 152597b48c8fSBarry Smith 15266f0a148fSBarry Smith for (i=0; i<N; i++) { 15276f0a148fSBarry Smith slot = l->v + rows[i]; 1528b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 15296f0a148fSBarry Smith } 1530f4df32b1SMatthew Knepley if (diag != 0.0) { 1531b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 15326f0a148fSBarry Smith for (i=0; i<N; i++) { 1533b9679d65SBarry Smith slot = l->v + (m+1)*rows[i]; 1534f4df32b1SMatthew Knepley *slot = diag; 15356f0a148fSBarry Smith } 15366f0a148fSBarry Smith } 15373a40ed3dSBarry Smith PetscFunctionReturn(0); 15386f0a148fSBarry Smith } 1539557bce09SLois Curfman McInnes 1540e0877f53SBarry Smith static PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[]) 154164e87e97SBarry Smith { 1542c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 15433a40ed3dSBarry Smith 15443a40ed3dSBarry Smith PetscFunctionBegin; 1545e32f2f54SBarry 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"); 154664e87e97SBarry Smith *array = mat->v; 15473a40ed3dSBarry Smith PetscFunctionReturn(0); 154864e87e97SBarry Smith } 15490754003eSLois Curfman McInnes 1550e0877f53SBarry Smith static PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1551ff14e315SSatish Balay { 15523a40ed3dSBarry Smith PetscFunctionBegin; 155309b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 15543a40ed3dSBarry Smith PetscFunctionReturn(0); 1555ff14e315SSatish Balay } 15560754003eSLois Curfman McInnes 1557dec5eb66SMatthew G Knepley /*@C 15588c778c55SBarry Smith MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored 155973a71a0fSBarry Smith 156073a71a0fSBarry Smith Not Collective 156173a71a0fSBarry Smith 156273a71a0fSBarry Smith Input Parameter: 1563579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 156473a71a0fSBarry Smith 156573a71a0fSBarry Smith Output Parameter: 156673a71a0fSBarry Smith . array - pointer to the data 156773a71a0fSBarry Smith 156873a71a0fSBarry Smith Level: intermediate 156973a71a0fSBarry Smith 15708c778c55SBarry Smith .seealso: MatDenseRestoreArray() 157173a71a0fSBarry Smith @*/ 15728c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 157373a71a0fSBarry Smith { 157473a71a0fSBarry Smith PetscErrorCode ierr; 157573a71a0fSBarry Smith 157673a71a0fSBarry Smith PetscFunctionBegin; 15778c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 157873a71a0fSBarry Smith PetscFunctionReturn(0); 157973a71a0fSBarry Smith } 158073a71a0fSBarry Smith 1581dec5eb66SMatthew G Knepley /*@C 1582579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 158373a71a0fSBarry Smith 158473a71a0fSBarry Smith Not Collective 158573a71a0fSBarry Smith 158673a71a0fSBarry Smith Input Parameters: 1587579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 158873a71a0fSBarry Smith . array - pointer to the data 158973a71a0fSBarry Smith 159073a71a0fSBarry Smith Level: intermediate 159173a71a0fSBarry Smith 15928c778c55SBarry Smith .seealso: MatDenseGetArray() 159373a71a0fSBarry Smith @*/ 15948c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 159573a71a0fSBarry Smith { 159673a71a0fSBarry Smith PetscErrorCode ierr; 159773a71a0fSBarry Smith 159873a71a0fSBarry Smith PetscFunctionBegin; 15998c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 160073a71a0fSBarry Smith PetscFunctionReturn(0); 160173a71a0fSBarry Smith } 160273a71a0fSBarry Smith 16037dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 16040754003eSLois Curfman McInnes { 1605c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 16066849ba73SBarry Smith PetscErrorCode ierr; 16075d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 16085d0c19d7SBarry Smith const PetscInt *irow,*icol; 160987828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 16100754003eSLois Curfman McInnes Mat newmat; 16110754003eSLois Curfman McInnes 16123a40ed3dSBarry Smith PetscFunctionBegin; 161378b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 161478b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1615e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1616e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 16170754003eSLois Curfman McInnes 1618182d2002SSatish Balay /* Check submatrixcall */ 1619182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 162013f74950SBarry Smith PetscInt n_cols,n_rows; 1621182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 162221a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1623f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1624c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 162521a2c019SBarry Smith } 1626182d2002SSatish Balay newmat = *B; 1627182d2002SSatish Balay } else { 16280754003eSLois Curfman McInnes /* Create and fill new matrix */ 1629ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 1630f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 16317adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 16320298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1633182d2002SSatish Balay } 1634182d2002SSatish Balay 1635182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1636182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1637182d2002SSatish Balay 1638182d2002SSatish Balay for (i=0; i<ncols; i++) { 16396de62eeeSBarry Smith av = v + mat->lda*icol[i]; 16402205254eSKarl Rupp for (j=0; j<nrows; j++) *bv++ = av[irow[j]]; 16410754003eSLois Curfman McInnes } 1642182d2002SSatish Balay 1643182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 16446d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 16456d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 16460754003eSLois Curfman McInnes 16470754003eSLois Curfman McInnes /* Free work space */ 164878b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 164978b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1650182d2002SSatish Balay *B = newmat; 16513a40ed3dSBarry Smith PetscFunctionReturn(0); 16520754003eSLois Curfman McInnes } 16530754003eSLois Curfman McInnes 16547dae84e0SHong Zhang static PetscErrorCode MatCreateSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1655905e6a2fSBarry Smith { 16566849ba73SBarry Smith PetscErrorCode ierr; 165713f74950SBarry Smith PetscInt i; 1658905e6a2fSBarry Smith 16593a40ed3dSBarry Smith PetscFunctionBegin; 1660905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1661df750dc8SHong Zhang ierr = PetscCalloc1(n+1,B);CHKERRQ(ierr); 1662905e6a2fSBarry Smith } 1663905e6a2fSBarry Smith 1664905e6a2fSBarry Smith for (i=0; i<n; i++) { 16657dae84e0SHong Zhang ierr = MatCreateSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1666905e6a2fSBarry Smith } 16673a40ed3dSBarry Smith PetscFunctionReturn(0); 1668905e6a2fSBarry Smith } 1669905e6a2fSBarry Smith 1670e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1671c0aa2d19SHong Zhang { 1672c0aa2d19SHong Zhang PetscFunctionBegin; 1673c0aa2d19SHong Zhang PetscFunctionReturn(0); 1674c0aa2d19SHong Zhang } 1675c0aa2d19SHong Zhang 1676e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1677c0aa2d19SHong Zhang { 1678c0aa2d19SHong Zhang PetscFunctionBegin; 1679c0aa2d19SHong Zhang PetscFunctionReturn(0); 1680c0aa2d19SHong Zhang } 1681c0aa2d19SHong Zhang 1682e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 16834b0e389bSBarry Smith { 16844b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 16856849ba73SBarry Smith PetscErrorCode ierr; 1686d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 16873a40ed3dSBarry Smith 16883a40ed3dSBarry Smith PetscFunctionBegin; 168933f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 169033f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1691cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 16923a40ed3dSBarry Smith PetscFunctionReturn(0); 16933a40ed3dSBarry Smith } 1694e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1695a5ce6ee0Svictorle if (lda1>m || lda2>m) { 16960dbb7854Svictorle for (j=0; j<n; j++) { 1697a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1698a5ce6ee0Svictorle } 1699a5ce6ee0Svictorle } else { 1700d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1701a5ce6ee0Svictorle } 1702273d9f13SBarry Smith PetscFunctionReturn(0); 1703273d9f13SBarry Smith } 1704273d9f13SBarry Smith 1705e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A) 1706273d9f13SBarry Smith { 1707dfbe8321SBarry Smith PetscErrorCode ierr; 1708273d9f13SBarry Smith 1709273d9f13SBarry Smith PetscFunctionBegin; 1710273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 17113a40ed3dSBarry Smith PetscFunctionReturn(0); 17124b0e389bSBarry Smith } 17134b0e389bSBarry Smith 1714ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1715ba337c44SJed Brown { 1716ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1717ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1718ba337c44SJed Brown PetscScalar *aa = a->v; 1719ba337c44SJed Brown 1720ba337c44SJed Brown PetscFunctionBegin; 1721ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1722ba337c44SJed Brown PetscFunctionReturn(0); 1723ba337c44SJed Brown } 1724ba337c44SJed Brown 1725ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1726ba337c44SJed Brown { 1727ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1728ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1729ba337c44SJed Brown PetscScalar *aa = a->v; 1730ba337c44SJed Brown 1731ba337c44SJed Brown PetscFunctionBegin; 1732ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1733ba337c44SJed Brown PetscFunctionReturn(0); 1734ba337c44SJed Brown } 1735ba337c44SJed Brown 1736ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 1737ba337c44SJed Brown { 1738ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1739ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1740ba337c44SJed Brown PetscScalar *aa = a->v; 1741ba337c44SJed Brown 1742ba337c44SJed Brown PetscFunctionBegin; 1743ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 1744ba337c44SJed Brown PetscFunctionReturn(0); 1745ba337c44SJed Brown } 1746284134d9SBarry Smith 1747a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1748150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1749a9fe9ddaSSatish Balay { 1750a9fe9ddaSSatish Balay PetscErrorCode ierr; 1751a9fe9ddaSSatish Balay 1752a9fe9ddaSSatish Balay PetscFunctionBegin; 1753a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 17543ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1755a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 17563ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1757a9fe9ddaSSatish Balay } 17583ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1759a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 17603ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1761a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1762a9fe9ddaSSatish Balay } 1763a9fe9ddaSSatish Balay 1764a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1765a9fe9ddaSSatish Balay { 1766ee16a9a1SHong Zhang PetscErrorCode ierr; 1767d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1768ee16a9a1SHong Zhang Mat Cmat; 1769a9fe9ddaSSatish Balay 1770ee16a9a1SHong Zhang PetscFunctionBegin; 1771e32f2f54SBarry 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); 1772ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1773ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1774ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 17750298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 1776d73949e8SHong Zhang 1777ee16a9a1SHong Zhang *C = Cmat; 1778ee16a9a1SHong Zhang PetscFunctionReturn(0); 1779ee16a9a1SHong Zhang } 1780a9fe9ddaSSatish Balay 1781a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1782a9fe9ddaSSatish Balay { 1783a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1784a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1785a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 17860805154bSBarry Smith PetscBLASInt m,n,k; 1787a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1788c5df96a5SBarry Smith PetscErrorCode ierr; 1789fd4e9aacSBarry Smith PetscBool flg; 1790a9fe9ddaSSatish Balay 1791a9fe9ddaSSatish Balay PetscFunctionBegin; 1792fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr); 1793fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense"); 1794fd4e9aacSBarry Smith 1795fd4e9aacSBarry Smith /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/ 1796fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr); 1797fd4e9aacSBarry Smith if (flg) { 1798fd4e9aacSBarry Smith C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense; 1799fd4e9aacSBarry Smith ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr); 1800fd4e9aacSBarry Smith PetscFunctionReturn(0); 1801fd4e9aacSBarry Smith } 1802fd4e9aacSBarry Smith 1803fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr); 1804fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense"); 1805c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1806c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1807c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 18085ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1809a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1810a9fe9ddaSSatish Balay } 1811a9fe9ddaSSatish Balay 181275648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1813a9fe9ddaSSatish Balay { 1814a9fe9ddaSSatish Balay PetscErrorCode ierr; 1815a9fe9ddaSSatish Balay 1816a9fe9ddaSSatish Balay PetscFunctionBegin; 1817a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 18183ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 181975648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 18203ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1821a9fe9ddaSSatish Balay } 18223ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 182375648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 18243ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1825a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1826a9fe9ddaSSatish Balay } 1827a9fe9ddaSSatish Balay 182875648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1829a9fe9ddaSSatish Balay { 1830ee16a9a1SHong Zhang PetscErrorCode ierr; 1831d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1832ee16a9a1SHong Zhang Mat Cmat; 1833a9fe9ddaSSatish Balay 1834ee16a9a1SHong Zhang PetscFunctionBegin; 1835e32f2f54SBarry 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); 1836ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1837ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1838ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 18390298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 18402205254eSKarl Rupp 1841ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 18422205254eSKarl Rupp 1843ee16a9a1SHong Zhang *C = Cmat; 1844ee16a9a1SHong Zhang PetscFunctionReturn(0); 1845ee16a9a1SHong Zhang } 1846a9fe9ddaSSatish Balay 184775648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1848a9fe9ddaSSatish Balay { 1849a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1850a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1851a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 18520805154bSBarry Smith PetscBLASInt m,n,k; 1853a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1854c5df96a5SBarry Smith PetscErrorCode ierr; 1855a9fe9ddaSSatish Balay 1856a9fe9ddaSSatish Balay PetscFunctionBegin; 1857c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr); 1858c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1859c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 18602fbe02b9SBarry Smith /* 18612fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 18622fbe02b9SBarry Smith */ 18635ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1864a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1865a9fe9ddaSSatish Balay } 1866985db425SBarry Smith 1867e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1868985db425SBarry Smith { 1869985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1870985db425SBarry Smith PetscErrorCode ierr; 1871d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1872985db425SBarry Smith PetscScalar *x; 1873985db425SBarry Smith MatScalar *aa = a->v; 1874985db425SBarry Smith 1875985db425SBarry Smith PetscFunctionBegin; 1876e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1877985db425SBarry Smith 1878985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1879985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1880985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1881e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1882985db425SBarry Smith for (i=0; i<m; i++) { 1883985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1884985db425SBarry Smith for (j=1; j<n; j++) { 1885985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1886985db425SBarry Smith } 1887985db425SBarry Smith } 1888985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1889985db425SBarry Smith PetscFunctionReturn(0); 1890985db425SBarry Smith } 1891985db425SBarry Smith 1892e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 1893985db425SBarry Smith { 1894985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1895985db425SBarry Smith PetscErrorCode ierr; 1896d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1897985db425SBarry Smith PetscScalar *x; 1898985db425SBarry Smith PetscReal atmp; 1899985db425SBarry Smith MatScalar *aa = a->v; 1900985db425SBarry Smith 1901985db425SBarry Smith PetscFunctionBegin; 1902e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1903985db425SBarry Smith 1904985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1905985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1906985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1907e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1908985db425SBarry Smith for (i=0; i<m; i++) { 19099189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 1910985db425SBarry Smith for (j=1; j<n; j++) { 1911985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 1912985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 1913985db425SBarry Smith } 1914985db425SBarry Smith } 1915985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1916985db425SBarry Smith PetscFunctionReturn(0); 1917985db425SBarry Smith } 1918985db425SBarry Smith 1919e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 1920985db425SBarry Smith { 1921985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1922985db425SBarry Smith PetscErrorCode ierr; 1923d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 1924985db425SBarry Smith PetscScalar *x; 1925985db425SBarry Smith MatScalar *aa = a->v; 1926985db425SBarry Smith 1927985db425SBarry Smith PetscFunctionBegin; 1928e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1929985db425SBarry Smith 1930985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1931985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1932985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1933e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1934985db425SBarry Smith for (i=0; i<m; i++) { 1935985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1936985db425SBarry Smith for (j=1; j<n; j++) { 1937985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1938985db425SBarry Smith } 1939985db425SBarry Smith } 1940985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1941985db425SBarry Smith PetscFunctionReturn(0); 1942985db425SBarry Smith } 1943985db425SBarry Smith 1944e0877f53SBarry Smith static PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 19458d0534beSBarry Smith { 19468d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 19478d0534beSBarry Smith PetscErrorCode ierr; 19488d0534beSBarry Smith PetscScalar *x; 19498d0534beSBarry Smith 19508d0534beSBarry Smith PetscFunctionBegin; 1951e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 19528d0534beSBarry Smith 19538d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1954d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 19558d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 19568d0534beSBarry Smith PetscFunctionReturn(0); 19578d0534beSBarry Smith } 19588d0534beSBarry Smith 19590716a85fSBarry Smith 19600716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 19610716a85fSBarry Smith { 19620716a85fSBarry Smith PetscErrorCode ierr; 19630716a85fSBarry Smith PetscInt i,j,m,n; 19640716a85fSBarry Smith PetscScalar *a; 19650716a85fSBarry Smith 19660716a85fSBarry Smith PetscFunctionBegin; 19670716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 19680716a85fSBarry Smith ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); 19698c778c55SBarry Smith ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr); 19700716a85fSBarry Smith if (type == NORM_2) { 19710716a85fSBarry Smith for (i=0; i<n; i++) { 19720716a85fSBarry Smith for (j=0; j<m; j++) { 19730716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 19740716a85fSBarry Smith } 19750716a85fSBarry Smith a += m; 19760716a85fSBarry Smith } 19770716a85fSBarry Smith } else if (type == NORM_1) { 19780716a85fSBarry Smith for (i=0; i<n; i++) { 19790716a85fSBarry Smith for (j=0; j<m; j++) { 19800716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 19810716a85fSBarry Smith } 19820716a85fSBarry Smith a += m; 19830716a85fSBarry Smith } 19840716a85fSBarry Smith } else if (type == NORM_INFINITY) { 19850716a85fSBarry Smith for (i=0; i<n; i++) { 19860716a85fSBarry Smith for (j=0; j<m; j++) { 19870716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 19880716a85fSBarry Smith } 19890716a85fSBarry Smith a += m; 19900716a85fSBarry Smith } 1991ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 19928c778c55SBarry Smith ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr); 19930716a85fSBarry Smith if (type == NORM_2) { 19948f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 19950716a85fSBarry Smith } 19960716a85fSBarry Smith PetscFunctionReturn(0); 19970716a85fSBarry Smith } 19980716a85fSBarry Smith 199973a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 200073a71a0fSBarry Smith { 200173a71a0fSBarry Smith PetscErrorCode ierr; 200273a71a0fSBarry Smith PetscScalar *a; 200373a71a0fSBarry Smith PetscInt m,n,i; 200473a71a0fSBarry Smith 200573a71a0fSBarry Smith PetscFunctionBegin; 200673a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 20078c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 200873a71a0fSBarry Smith for (i=0; i<m*n; i++) { 200973a71a0fSBarry Smith ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr); 201073a71a0fSBarry Smith } 20118c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 201273a71a0fSBarry Smith PetscFunctionReturn(0); 201373a71a0fSBarry Smith } 201473a71a0fSBarry Smith 20153b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool *missing,PetscInt *d) 20163b49f96aSBarry Smith { 20173b49f96aSBarry Smith PetscFunctionBegin; 20183b49f96aSBarry Smith *missing = PETSC_FALSE; 20193b49f96aSBarry Smith PetscFunctionReturn(0); 20203b49f96aSBarry Smith } 202173a71a0fSBarry Smith 2022abc3b08eSStefano Zampini 2023289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2024a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2025905e6a2fSBarry Smith MatGetRow_SeqDense, 2026905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2027905e6a2fSBarry Smith MatMult_SeqDense, 202897304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 20297c922b88SBarry Smith MatMultTranspose_SeqDense, 20307c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2031db4efbfdSBarry Smith 0, 2032db4efbfdSBarry Smith 0, 2033db4efbfdSBarry Smith 0, 2034db4efbfdSBarry Smith /* 10*/ 0, 2035905e6a2fSBarry Smith MatLUFactor_SeqDense, 2036905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 203741f059aeSBarry Smith MatSOR_SeqDense, 2038ec8511deSBarry Smith MatTranspose_SeqDense, 203997304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2040905e6a2fSBarry Smith MatEqual_SeqDense, 2041905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2042905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2043905e6a2fSBarry Smith MatNorm_SeqDense, 2044c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2045c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2046905e6a2fSBarry Smith MatSetOption_SeqDense, 2047905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2048d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2049db4efbfdSBarry Smith 0, 2050db4efbfdSBarry Smith 0, 2051db4efbfdSBarry Smith 0, 2052db4efbfdSBarry Smith 0, 20534994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2054273d9f13SBarry Smith 0, 2055905e6a2fSBarry Smith 0, 205673a71a0fSBarry Smith 0, 205773a71a0fSBarry Smith 0, 2058d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2059a5ae1ecdSBarry Smith 0, 2060a5ae1ecdSBarry Smith 0, 2061a5ae1ecdSBarry Smith 0, 2062a5ae1ecdSBarry Smith 0, 2063d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 20647dae84e0SHong Zhang MatCreateSubMatrices_SeqDense, 2065a5ae1ecdSBarry Smith 0, 20664b0e389bSBarry Smith MatGetValues_SeqDense, 2067a5ae1ecdSBarry Smith MatCopy_SeqDense, 2068d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2069a5ae1ecdSBarry Smith MatScale_SeqDense, 20707d68702bSBarry Smith MatShift_Basic, 2071a5ae1ecdSBarry Smith 0, 20723f49a652SStefano Zampini MatZeroRowsColumns_SeqDense, 207373a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2074a5ae1ecdSBarry Smith 0, 2075a5ae1ecdSBarry Smith 0, 2076a5ae1ecdSBarry Smith 0, 2077a5ae1ecdSBarry Smith 0, 2078d519adbfSMatthew Knepley /* 54*/ 0, 2079a5ae1ecdSBarry Smith 0, 2080a5ae1ecdSBarry Smith 0, 2081a5ae1ecdSBarry Smith 0, 2082a5ae1ecdSBarry Smith 0, 2083d519adbfSMatthew Knepley /* 59*/ 0, 2084e03a110bSBarry Smith MatDestroy_SeqDense, 2085e03a110bSBarry Smith MatView_SeqDense, 2086357abbc8SBarry Smith 0, 208797304618SKris Buschelman 0, 2088d519adbfSMatthew Knepley /* 64*/ 0, 208997304618SKris Buschelman 0, 209097304618SKris Buschelman 0, 209197304618SKris Buschelman 0, 209297304618SKris Buschelman 0, 2093d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 209497304618SKris Buschelman 0, 209597304618SKris Buschelman 0, 209697304618SKris Buschelman 0, 209797304618SKris Buschelman 0, 2098d519adbfSMatthew Knepley /* 74*/ 0, 209997304618SKris Buschelman 0, 210097304618SKris Buschelman 0, 210197304618SKris Buschelman 0, 210297304618SKris Buschelman 0, 2103d519adbfSMatthew Knepley /* 79*/ 0, 210497304618SKris Buschelman 0, 210597304618SKris Buschelman 0, 210697304618SKris Buschelman 0, 21075bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2108865e5f61SKris Buschelman 0, 21091cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2110865e5f61SKris Buschelman 0, 2111865e5f61SKris Buschelman 0, 2112865e5f61SKris Buschelman 0, 2113d519adbfSMatthew Knepley /* 89*/ MatMatMult_SeqDense_SeqDense, 2114a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 2115a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2116abc3b08eSStefano Zampini MatPtAP_SeqDense_SeqDense, 2117abc3b08eSStefano Zampini MatPtAPSymbolic_SeqDense_SeqDense, 2118abc3b08eSStefano Zampini /* 94*/ MatPtAPNumeric_SeqDense_SeqDense, 21195df89d91SHong Zhang 0, 21205df89d91SHong Zhang 0, 21215df89d91SHong Zhang 0, 2122284134d9SBarry Smith 0, 2123d519adbfSMatthew Knepley /* 99*/ 0, 2124284134d9SBarry Smith 0, 2125284134d9SBarry Smith 0, 2126ba337c44SJed Brown MatConjugate_SeqDense, 2127f73d5cc4SBarry Smith 0, 2128ba337c44SJed Brown /*104*/ 0, 2129ba337c44SJed Brown MatRealPart_SeqDense, 2130ba337c44SJed Brown MatImaginaryPart_SeqDense, 2131985db425SBarry Smith 0, 2132985db425SBarry Smith 0, 213385e2c93fSHong Zhang /*109*/ MatMatSolve_SeqDense, 2134985db425SBarry Smith 0, 21358d0534beSBarry Smith MatGetRowMin_SeqDense, 2136aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 21373b49f96aSBarry Smith MatMissingDiagonal_SeqDense, 2138aabbc4fbSShri Abhyankar /*114*/ 0, 2139aabbc4fbSShri Abhyankar 0, 2140aabbc4fbSShri Abhyankar 0, 2141aabbc4fbSShri Abhyankar 0, 2142aabbc4fbSShri Abhyankar 0, 2143aabbc4fbSShri Abhyankar /*119*/ 0, 2144aabbc4fbSShri Abhyankar 0, 2145aabbc4fbSShri Abhyankar 0, 21460716a85fSBarry Smith 0, 21470716a85fSBarry Smith 0, 21480716a85fSBarry Smith /*124*/ 0, 21495df89d91SHong Zhang MatGetColumnNorms_SeqDense, 21505df89d91SHong Zhang 0, 21515df89d91SHong Zhang 0, 21525df89d91SHong Zhang 0, 21535df89d91SHong Zhang /*129*/ 0, 215475648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 215575648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 215675648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 21573964eb88SJed Brown 0, 21583964eb88SJed Brown /*134*/ 0, 21593964eb88SJed Brown 0, 21603964eb88SJed Brown 0, 21613964eb88SJed Brown 0, 21623964eb88SJed Brown 0, 21633964eb88SJed Brown /*139*/ 0, 2164f9426fe0SMark Adams 0, 21653964eb88SJed Brown 0 2166985db425SBarry Smith }; 216790ace30eSBarry Smith 21684b828684SBarry Smith /*@C 2169fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2170d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2171d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2172289bc588SBarry Smith 2173db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2174db81eaa0SLois Curfman McInnes 217520563c6bSBarry Smith Input Parameters: 2176db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 21770c775827SLois Curfman McInnes . m - number of rows 217818f449edSLois Curfman McInnes . n - number of columns 21790298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2180dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 218120563c6bSBarry Smith 218220563c6bSBarry Smith Output Parameter: 218344cd7ae7SLois Curfman McInnes . A - the matrix 218420563c6bSBarry Smith 2185b259b22eSLois Curfman McInnes Notes: 218618f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 218718f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 21880298fd71SBarry Smith set data=NULL. 218918f449edSLois Curfman McInnes 2190027ccd11SLois Curfman McInnes Level: intermediate 2191027ccd11SLois Curfman McInnes 2192dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 2193d65003e9SLois Curfman McInnes 219469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 219520563c6bSBarry Smith @*/ 21967087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2197289bc588SBarry Smith { 2198dfbe8321SBarry Smith PetscErrorCode ierr; 21993b2fbd54SBarry Smith 22003a40ed3dSBarry Smith PetscFunctionBegin; 2201f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2202f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2203273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2204273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2205273d9f13SBarry Smith PetscFunctionReturn(0); 2206273d9f13SBarry Smith } 2207273d9f13SBarry Smith 2208273d9f13SBarry Smith /*@C 2209273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2210273d9f13SBarry Smith 2211273d9f13SBarry Smith Collective on MPI_Comm 2212273d9f13SBarry Smith 2213273d9f13SBarry Smith Input Parameters: 22141c4f3114SJed Brown + B - the matrix 22150298fd71SBarry Smith - data - the array (or NULL) 2216273d9f13SBarry Smith 2217273d9f13SBarry Smith Notes: 2218273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2219273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2220284134d9SBarry Smith need not call this routine. 2221273d9f13SBarry Smith 2222273d9f13SBarry Smith Level: intermediate 2223273d9f13SBarry Smith 2224273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2225273d9f13SBarry Smith 222669b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2227867c911aSBarry Smith 2228273d9f13SBarry Smith @*/ 22297087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2230273d9f13SBarry Smith { 22314ac538c5SBarry Smith PetscErrorCode ierr; 2232a23d5eceSKris Buschelman 2233a23d5eceSKris Buschelman PetscFunctionBegin; 22344ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2235a23d5eceSKris Buschelman PetscFunctionReturn(0); 2236a23d5eceSKris Buschelman } 2237a23d5eceSKris Buschelman 22387087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2239a23d5eceSKris Buschelman { 2240273d9f13SBarry Smith Mat_SeqDense *b; 2241dfbe8321SBarry Smith PetscErrorCode ierr; 2242273d9f13SBarry Smith 2243273d9f13SBarry Smith PetscFunctionBegin; 2244273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2245a868139aSShri Abhyankar 224634ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 224734ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 224834ef9618SShri Abhyankar 2249273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 225086d161a7SShri Abhyankar b->Mmax = B->rmap->n; 225186d161a7SShri Abhyankar b->Nmax = B->cmap->n; 225286d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 225386d161a7SShri Abhyankar 2254220afb94SBarry Smith ierr = PetscIntMultError(b->lda,b->Nmax,NULL);CHKERRQ(ierr); 22559e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 22569e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2257e92229d0SSatish Balay ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr); 22583bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 22592205254eSKarl Rupp 22609e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2261273d9f13SBarry Smith } else { /* user-allocated storage */ 22629e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2263273d9f13SBarry Smith b->v = data; 2264273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2265273d9f13SBarry Smith } 22660450473dSBarry Smith B->assembled = PETSC_TRUE; 2267273d9f13SBarry Smith PetscFunctionReturn(0); 2268273d9f13SBarry Smith } 2269273d9f13SBarry Smith 227065b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 2271cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 22728baccfbdSHong Zhang { 2273d77f618aSHong Zhang Mat mat_elemental; 2274d77f618aSHong Zhang PetscErrorCode ierr; 2275d77f618aSHong Zhang PetscScalar *array,*v_colwise; 2276d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 2277d77f618aSHong Zhang 22788baccfbdSHong Zhang PetscFunctionBegin; 2279d77f618aSHong Zhang ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr); 2280d77f618aSHong Zhang ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr); 2281d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 2282d77f618aSHong Zhang k = 0; 2283d77f618aSHong Zhang for (j=0; j<N; j++) { 2284d77f618aSHong Zhang cols[j] = j; 2285d77f618aSHong Zhang for (i=0; i<M; i++) { 2286d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 2287d77f618aSHong Zhang } 2288d77f618aSHong Zhang } 2289d77f618aSHong Zhang for (i=0; i<M; i++) { 2290d77f618aSHong Zhang rows[i] = i; 2291d77f618aSHong Zhang } 2292d77f618aSHong Zhang ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr); 2293d77f618aSHong Zhang 2294d77f618aSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr); 2295d77f618aSHong Zhang ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 2296d77f618aSHong Zhang ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr); 2297d77f618aSHong Zhang ierr = MatSetUp(mat_elemental);CHKERRQ(ierr); 2298d77f618aSHong Zhang 2299d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 2300d77f618aSHong Zhang ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr); 2301d77f618aSHong Zhang ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2302d77f618aSHong Zhang ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2303d77f618aSHong Zhang ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr); 2304d77f618aSHong Zhang 2305511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 230628be2f97SBarry Smith ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr); 2307d77f618aSHong Zhang } else { 2308d77f618aSHong Zhang *newmat = mat_elemental; 2309d77f618aSHong Zhang } 23108baccfbdSHong Zhang PetscFunctionReturn(0); 23118baccfbdSHong Zhang } 231265b80a83SHong Zhang #endif 23138baccfbdSHong Zhang 23141b807ce4Svictorle /*@C 23151b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 23161b807ce4Svictorle 23171b807ce4Svictorle Input parameter: 23181b807ce4Svictorle + A - the matrix 23191b807ce4Svictorle - lda - the leading dimension 23201b807ce4Svictorle 23211b807ce4Svictorle Notes: 2322867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 23231b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 23241b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 23251b807ce4Svictorle 23261b807ce4Svictorle Level: intermediate 23271b807ce4Svictorle 23281b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 23291b807ce4Svictorle 2330284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2331867c911aSBarry Smith 23321b807ce4Svictorle @*/ 23337087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 23341b807ce4Svictorle { 23351b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 233621a2c019SBarry Smith 23371b807ce4Svictorle PetscFunctionBegin; 2338e32f2f54SBarry 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); 23391b807ce4Svictorle b->lda = lda; 234021a2c019SBarry Smith b->changelda = PETSC_FALSE; 234121a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 23421b807ce4Svictorle PetscFunctionReturn(0); 23431b807ce4Svictorle } 23441b807ce4Svictorle 23450bad9183SKris Buschelman /*MC 2346fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 23470bad9183SKris Buschelman 23480bad9183SKris Buschelman Options Database Keys: 23490bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 23500bad9183SKris Buschelman 23510bad9183SKris Buschelman Level: beginner 23520bad9183SKris Buschelman 235389665df3SBarry Smith .seealso: MatCreateSeqDense() 235489665df3SBarry Smith 23550bad9183SKris Buschelman M*/ 23560bad9183SKris Buschelman 23578cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B) 2358273d9f13SBarry Smith { 2359273d9f13SBarry Smith Mat_SeqDense *b; 2360dfbe8321SBarry Smith PetscErrorCode ierr; 23617c334f02SBarry Smith PetscMPIInt size; 2362273d9f13SBarry Smith 2363273d9f13SBarry Smith PetscFunctionBegin; 2364ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 2365e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 236655659b69SBarry Smith 2367b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 2368549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 236944cd7ae7SLois Curfman McInnes B->data = (void*)b; 237018f449edSLois Curfman McInnes 237144cd7ae7SLois Curfman McInnes b->pivots = 0; 2372273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2373273d9f13SBarry Smith b->v = 0; 237421a2c019SBarry Smith b->changelda = PETSC_FALSE; 23754e220ebcSLois Curfman McInnes 2376bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 2377bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2378bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 23798baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 23808baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 23818baccfbdSHong Zhang #endif 2382bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 2383bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2384bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2385bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2386abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 23873bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 23883bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 23893bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 239017667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 23913a40ed3dSBarry Smith PetscFunctionReturn(0); 2392289bc588SBarry Smith } 2393