1be1d678aSKris Buschelman 267e560aaSBarry Smith /* 367e560aaSBarry Smith Defines the basic matrix operations for sequential dense. 467e560aaSBarry Smith */ 5289bc588SBarry Smith 6dec5eb66SMatthew G Knepley #include <../src/mat/impls/dense/seq/dense.h> /*I "petscmat.h" I*/ 7c6db04a5SJed Brown #include <petscblaslapack.h> 8289bc588SBarry Smith 96a63e612SBarry Smith #include <../src/mat/impls/aij/seq/aij.h> 10b2573a8aSBarry Smith 116a63e612SBarry Smith #undef __FUNCT__ 123f49a652SStefano Zampini #define __FUNCT__ "MatZeroRowsColumns_SeqDense" 133f49a652SStefano Zampini PetscErrorCode MatZeroRowsColumns_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 143f49a652SStefano Zampini { 153f49a652SStefano Zampini PetscErrorCode ierr; 163f49a652SStefano Zampini Mat_SeqDense *l = (Mat_SeqDense*)A->data; 173f49a652SStefano Zampini PetscInt m = l->lda, n = A->cmap->n,r = A->rmap->n, i,j; 183f49a652SStefano Zampini PetscScalar *slot,*bb; 193f49a652SStefano Zampini const PetscScalar *xx; 203f49a652SStefano Zampini 213f49a652SStefano Zampini PetscFunctionBegin; 223f49a652SStefano Zampini #if defined(PETSC_USE_DEBUG) 233f49a652SStefano Zampini for (i=0; i<N; i++) { 243f49a652SStefano Zampini if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 253f49a652SStefano 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); 263f49a652SStefano 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); 273f49a652SStefano Zampini } 283f49a652SStefano Zampini #endif 293f49a652SStefano Zampini 303f49a652SStefano Zampini /* fix right hand side if needed */ 313f49a652SStefano Zampini if (x && b) { 323f49a652SStefano Zampini ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 333f49a652SStefano Zampini ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 343f49a652SStefano Zampini for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 353f49a652SStefano Zampini ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 363f49a652SStefano Zampini ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 373f49a652SStefano Zampini } 383f49a652SStefano Zampini 393f49a652SStefano Zampini for (i=0; i<N; i++) { 403f49a652SStefano Zampini slot = l->v + rows[i]*m; 413f49a652SStefano Zampini ierr = PetscMemzero(slot,r*sizeof(PetscScalar));CHKERRQ(ierr); 423f49a652SStefano Zampini } 433f49a652SStefano Zampini for (i=0; i<N; i++) { 443f49a652SStefano Zampini slot = l->v + rows[i]; 453f49a652SStefano Zampini for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 463f49a652SStefano Zampini } 473f49a652SStefano Zampini if (diag != 0.0) { 483f49a652SStefano Zampini if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 493f49a652SStefano Zampini for (i=0; i<N; i++) { 503f49a652SStefano Zampini slot = l->v + (m+1)*rows[i]; 513f49a652SStefano Zampini *slot = diag; 523f49a652SStefano Zampini } 533f49a652SStefano Zampini } 543f49a652SStefano Zampini PetscFunctionReturn(0); 553f49a652SStefano Zampini } 563f49a652SStefano Zampini 573f49a652SStefano Zampini #undef __FUNCT__ 58abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAPNumeric_SeqDense_SeqDense" 59abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C) 60abc3b08eSStefano Zampini { 61abc3b08eSStefano Zampini Mat_SeqDense *c = (Mat_SeqDense*)(C->data); 62abc3b08eSStefano Zampini PetscErrorCode ierr; 63abc3b08eSStefano Zampini 64abc3b08eSStefano Zampini PetscFunctionBegin; 65abc3b08eSStefano Zampini ierr = MatMatMultNumeric_SeqDense_SeqDense(A,P,c->ptapwork);CHKERRQ(ierr); 66abc3b08eSStefano Zampini ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(P,c->ptapwork,C);CHKERRQ(ierr); 67abc3b08eSStefano Zampini PetscFunctionReturn(0); 68abc3b08eSStefano Zampini } 69abc3b08eSStefano Zampini 70abc3b08eSStefano Zampini #undef __FUNCT__ 71abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAPSymbolic_SeqDense_SeqDense" 72abc3b08eSStefano Zampini PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat *C) 73abc3b08eSStefano Zampini { 74abc3b08eSStefano Zampini Mat_SeqDense *c; 75abc3b08eSStefano Zampini PetscErrorCode ierr; 76abc3b08eSStefano Zampini 77abc3b08eSStefano Zampini PetscFunctionBegin; 78abc3b08eSStefano Zampini ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),P->cmap->N,P->cmap->N,NULL,C);CHKERRQ(ierr); 79abc3b08eSStefano Zampini c = (Mat_SeqDense*)((*C)->data); 80abc3b08eSStefano Zampini ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),A->rmap->N,P->cmap->N,NULL,&c->ptapwork);CHKERRQ(ierr); 81abc3b08eSStefano Zampini PetscFunctionReturn(0); 82abc3b08eSStefano Zampini } 83abc3b08eSStefano Zampini 84abc3b08eSStefano Zampini #undef __FUNCT__ 85abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAP_SeqDense_SeqDense" 86150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatPtAP_SeqDense_SeqDense(Mat A,Mat P,MatReuse reuse,PetscReal fill,Mat *C) 87abc3b08eSStefano Zampini { 88abc3b08eSStefano Zampini PetscErrorCode ierr; 89abc3b08eSStefano Zampini 90abc3b08eSStefano Zampini PetscFunctionBegin; 91abc3b08eSStefano Zampini if (reuse == MAT_INITIAL_MATRIX) { 92abc3b08eSStefano Zampini ierr = MatPtAPSymbolic_SeqDense_SeqDense(A,P,fill,C);CHKERRQ(ierr); 93abc3b08eSStefano Zampini } 94abc3b08eSStefano Zampini ierr = PetscLogEventBegin(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 95abc3b08eSStefano Zampini ierr = (*(*C)->ops->ptapnumeric)(A,P,*C);CHKERRQ(ierr); 96abc3b08eSStefano Zampini ierr = PetscLogEventEnd(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr); 97abc3b08eSStefano Zampini PetscFunctionReturn(0); 98abc3b08eSStefano Zampini } 99abc3b08eSStefano Zampini 100abc3b08eSStefano Zampini #undef __FUNCT__ 101b49cda9fSStefano Zampini #define __FUNCT__ "MatConvert_SeqAIJ_SeqDense" 102cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat) 103b49cda9fSStefano Zampini { 104a13144ffSStefano Zampini Mat B = NULL; 105b49cda9fSStefano Zampini Mat_SeqAIJ *a = (Mat_SeqAIJ*)A->data; 106b49cda9fSStefano Zampini Mat_SeqDense *b; 107b49cda9fSStefano Zampini PetscErrorCode ierr; 108b49cda9fSStefano Zampini PetscInt *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i; 109b49cda9fSStefano Zampini MatScalar *av=a->a; 110a13144ffSStefano Zampini PetscBool isseqdense; 111b49cda9fSStefano Zampini 112b49cda9fSStefano Zampini PetscFunctionBegin; 113a13144ffSStefano Zampini if (reuse == MAT_REUSE_MATRIX) { 114a13144ffSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)*newmat,MATSEQDENSE,&isseqdense);CHKERRQ(ierr); 115a13144ffSStefano Zampini if (!isseqdense) SETERRQ1(PetscObjectComm((PetscObject)*newmat),PETSC_ERR_USER,"Cannot reuse matrix of type %s",((PetscObject)(*newmat))->type); 116a13144ffSStefano Zampini } 117a13144ffSStefano Zampini if (reuse != MAT_REUSE_MATRIX) { 118b49cda9fSStefano Zampini ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 119b49cda9fSStefano Zampini ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr); 120b49cda9fSStefano Zampini ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr); 121b49cda9fSStefano Zampini ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr); 122b49cda9fSStefano Zampini b = (Mat_SeqDense*)(B->data); 123a13144ffSStefano Zampini } else { 124a13144ffSStefano Zampini b = (Mat_SeqDense*)((*newmat)->data); 125a13144ffSStefano Zampini ierr = PetscMemzero(b->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr); 126a13144ffSStefano Zampini } 127b49cda9fSStefano Zampini for (i=0; i<m; i++) { 128b49cda9fSStefano Zampini PetscInt j; 129b49cda9fSStefano Zampini for (j=0;j<ai[1]-ai[0];j++) { 130b49cda9fSStefano Zampini b->v[*aj*m+i] = *av; 131b49cda9fSStefano Zampini aj++; 132b49cda9fSStefano Zampini av++; 133b49cda9fSStefano Zampini } 134b49cda9fSStefano Zampini ai++; 135b49cda9fSStefano Zampini } 136b49cda9fSStefano Zampini 137511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 138a13144ffSStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 139a13144ffSStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 14028be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 141b49cda9fSStefano Zampini } else { 142a13144ffSStefano Zampini if (B) *newmat = B; 143a13144ffSStefano Zampini ierr = MatAssemblyBegin(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 144a13144ffSStefano Zampini ierr = MatAssemblyEnd(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 145b49cda9fSStefano Zampini } 146b49cda9fSStefano Zampini PetscFunctionReturn(0); 147b49cda9fSStefano Zampini } 148b49cda9fSStefano Zampini 149b49cda9fSStefano Zampini #undef __FUNCT__ 1506a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ" 151cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 1526a63e612SBarry Smith { 1536a63e612SBarry Smith Mat B; 1546a63e612SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1556a63e612SBarry Smith PetscErrorCode ierr; 1569399e1b8SMatthew G. Knepley PetscInt i, j; 1579399e1b8SMatthew G. Knepley PetscInt *rows, *nnz; 1589399e1b8SMatthew G. Knepley MatScalar *aa = a->v, *vals; 1596a63e612SBarry Smith 1606a63e612SBarry Smith PetscFunctionBegin; 161ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr); 1626a63e612SBarry Smith ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr); 1636a63e612SBarry Smith ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr); 1649399e1b8SMatthew G. Knepley ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr); 1659399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 1669399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i]; 1676a63e612SBarry Smith aa += a->lda; 1686a63e612SBarry Smith } 1699399e1b8SMatthew G. Knepley ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr); 1709399e1b8SMatthew G. Knepley aa = a->v; 1719399e1b8SMatthew G. Knepley for (j=0; j<A->cmap->n; j++) { 1729399e1b8SMatthew G. Knepley PetscInt numRows = 0; 1739399e1b8SMatthew G. Knepley for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];} 1749399e1b8SMatthew G. Knepley ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr); 1759399e1b8SMatthew G. Knepley aa += a->lda; 1769399e1b8SMatthew G. Knepley } 1779399e1b8SMatthew G. Knepley ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr); 1786a63e612SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1796a63e612SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1806a63e612SBarry Smith 181511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 18228be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 1836a63e612SBarry Smith } else { 1846a63e612SBarry Smith *newmat = B; 1856a63e612SBarry Smith } 1866a63e612SBarry Smith PetscFunctionReturn(0); 1876a63e612SBarry Smith } 1886a63e612SBarry Smith 1894a2ae208SSatish Balay #undef __FUNCT__ 1904a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense" 191e0877f53SBarry Smith static PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 1921987afe7SBarry Smith { 1931987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 194f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 19513f74950SBarry Smith PetscInt j; 1960805154bSBarry Smith PetscBLASInt N,m,ldax,lday,one = 1; 197efee365bSSatish Balay PetscErrorCode ierr; 1983a40ed3dSBarry Smith 1993a40ed3dSBarry Smith PetscFunctionBegin; 200c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr); 201c5df96a5SBarry Smith ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr); 202c5df96a5SBarry Smith ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr); 203c5df96a5SBarry Smith ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr); 204a5ce6ee0Svictorle if (ldax>m || lday>m) { 205d0f46423SBarry Smith for (j=0; j<X->cmap->n; j++) { 2068b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one)); 207a5ce6ee0Svictorle } 208a5ce6ee0Svictorle } else { 2098b83055fSJed Brown PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one)); 210a5ce6ee0Svictorle } 211a3fa217bSJose E. Roman ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr); 2120450473dSBarry Smith ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr); 2133a40ed3dSBarry Smith PetscFunctionReturn(0); 2141987afe7SBarry Smith } 2151987afe7SBarry Smith 2164a2ae208SSatish Balay #undef __FUNCT__ 2174a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense" 218e0877f53SBarry Smith static PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 219289bc588SBarry Smith { 220d0f46423SBarry Smith PetscInt N = A->rmap->n*A->cmap->n; 2213a40ed3dSBarry Smith 2223a40ed3dSBarry Smith PetscFunctionBegin; 2234e220ebcSLois Curfman McInnes info->block_size = 1.0; 2244e220ebcSLois Curfman McInnes info->nz_allocated = (double)N; 2256de62eeeSBarry Smith info->nz_used = (double)N; 2266de62eeeSBarry Smith info->nz_unneeded = (double)0; 2274e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 2284e220ebcSLois Curfman McInnes info->mallocs = 0; 2297adad957SLisandro Dalcin info->memory = ((PetscObject)A)->mem; 2304e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 2314e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 2324e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 2333a40ed3dSBarry Smith PetscFunctionReturn(0); 234289bc588SBarry Smith } 235289bc588SBarry Smith 2364a2ae208SSatish Balay #undef __FUNCT__ 2374a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense" 238e0877f53SBarry Smith static PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 23980cd9d93SLois Curfman McInnes { 240273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 241f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 242efee365bSSatish Balay PetscErrorCode ierr; 243c5df96a5SBarry Smith PetscBLASInt one = 1,j,nz,lda; 24480cd9d93SLois Curfman McInnes 2453a40ed3dSBarry Smith PetscFunctionBegin; 246c5df96a5SBarry Smith ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr); 247d0f46423SBarry Smith if (lda>A->rmap->n) { 248c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr); 249d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 2508b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one)); 251a5ce6ee0Svictorle } 252a5ce6ee0Svictorle } else { 253c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr); 2548b83055fSJed Brown PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one)); 255a5ce6ee0Svictorle } 256efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 2573a40ed3dSBarry Smith PetscFunctionReturn(0); 25880cd9d93SLois Curfman McInnes } 25980cd9d93SLois Curfman McInnes 2601cbb95d3SBarry Smith #undef __FUNCT__ 2611cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense" 262e0877f53SBarry Smith static PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool *fl) 2631cbb95d3SBarry Smith { 2641cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 265d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,N; 2661cbb95d3SBarry Smith PetscScalar *v = a->v; 2671cbb95d3SBarry Smith 2681cbb95d3SBarry Smith PetscFunctionBegin; 2691cbb95d3SBarry Smith *fl = PETSC_FALSE; 270d0f46423SBarry Smith if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0); 2711cbb95d3SBarry Smith N = a->lda; 2721cbb95d3SBarry Smith 2731cbb95d3SBarry Smith for (i=0; i<m; i++) { 2741cbb95d3SBarry Smith for (j=i+1; j<m; j++) { 2751cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 2761cbb95d3SBarry Smith } 2771cbb95d3SBarry Smith } 2781cbb95d3SBarry Smith *fl = PETSC_TRUE; 2791cbb95d3SBarry Smith PetscFunctionReturn(0); 2801cbb95d3SBarry Smith } 2811cbb95d3SBarry Smith 282b24902e0SBarry Smith #undef __FUNCT__ 283b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense" 284e0877f53SBarry Smith static PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues) 285b24902e0SBarry Smith { 286b24902e0SBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 287b24902e0SBarry Smith PetscErrorCode ierr; 288b24902e0SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 289b24902e0SBarry Smith 290b24902e0SBarry Smith PetscFunctionBegin; 291aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr); 292aa5ea44dSBarry Smith ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr); 2930298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr); 294b24902e0SBarry Smith if (cpvalues == MAT_COPY_VALUES) { 295b24902e0SBarry Smith l = (Mat_SeqDense*)newi->data; 296d0f46423SBarry Smith if (lda>A->rmap->n) { 297d0f46423SBarry Smith m = A->rmap->n; 298d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 299b24902e0SBarry Smith ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 300b24902e0SBarry Smith } 301b24902e0SBarry Smith } else { 302d0f46423SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 303b24902e0SBarry Smith } 304b24902e0SBarry Smith } 305b24902e0SBarry Smith newi->assembled = PETSC_TRUE; 306b24902e0SBarry Smith PetscFunctionReturn(0); 307b24902e0SBarry Smith } 308b24902e0SBarry Smith 3094a2ae208SSatish Balay #undef __FUNCT__ 3104a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense" 311e0877f53SBarry Smith static PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 31202cad45dSBarry Smith { 3136849ba73SBarry Smith PetscErrorCode ierr; 31402cad45dSBarry Smith 3153a40ed3dSBarry Smith PetscFunctionBegin; 316ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr); 317d0f46423SBarry Smith ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 3185c9eb25fSBarry Smith ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 319719d5645SBarry Smith ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr); 320b24902e0SBarry Smith PetscFunctionReturn(0); 321b24902e0SBarry Smith } 322b24902e0SBarry Smith 3236ee01492SSatish Balay 324e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*); 325719d5645SBarry Smith 3264a2ae208SSatish Balay #undef __FUNCT__ 3274a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense" 328e0877f53SBarry Smith static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 329289bc588SBarry Smith { 3304482741eSBarry Smith MatFactorInfo info; 331a093e273SMatthew Knepley PetscErrorCode ierr; 3323a40ed3dSBarry Smith 3333a40ed3dSBarry Smith PetscFunctionBegin; 334c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 335719d5645SBarry Smith ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr); 3363a40ed3dSBarry Smith PetscFunctionReturn(0); 337289bc588SBarry Smith } 3386ee01492SSatish Balay 3390b4b3355SBarry Smith #undef __FUNCT__ 3404a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense" 341e0877f53SBarry Smith static PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 342289bc588SBarry Smith { 343c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 3446849ba73SBarry Smith PetscErrorCode ierr; 345f1ceaac6SMatthew G. Knepley const PetscScalar *x; 346f1ceaac6SMatthew G. Knepley PetscScalar *y; 347c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 34867e560aaSBarry Smith 3493a40ed3dSBarry Smith PetscFunctionBegin; 350c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 351f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 3521ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 353d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 354d5f3da31SBarry Smith if (A->factortype == MAT_FACTOR_LU) { 355ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 356e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 357ae7cfcebSSatish Balay #else 3588b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 359e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 360ae7cfcebSSatish Balay #endif 361d5f3da31SBarry Smith } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 362ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 363e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 364ae7cfcebSSatish Balay #else 3658b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 366e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 367ae7cfcebSSatish Balay #endif 3682205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 369f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 3701ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 371dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 3723a40ed3dSBarry Smith PetscFunctionReturn(0); 373289bc588SBarry Smith } 3746ee01492SSatish Balay 3754a2ae208SSatish Balay #undef __FUNCT__ 37685e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense" 377e0877f53SBarry Smith static PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X) 37885e2c93fSHong Zhang { 37985e2c93fSHong Zhang Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 38085e2c93fSHong Zhang PetscErrorCode ierr; 38185e2c93fSHong Zhang PetscScalar *b,*x; 382efb80c78SLisandro Dalcin PetscInt n; 383783b601eSJed Brown PetscBLASInt nrhs,info,m; 384bda8bf91SBarry Smith PetscBool flg; 38585e2c93fSHong Zhang 38685e2c93fSHong Zhang PetscFunctionBegin; 387c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 3880298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 389ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix"); 3900298fd71SBarry Smith ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr); 391ce94432eSBarry Smith if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix"); 392bda8bf91SBarry Smith 3930298fd71SBarry Smith ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr); 394c5df96a5SBarry Smith ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr); 3958c778c55SBarry Smith ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr); 3968c778c55SBarry Smith ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr); 39785e2c93fSHong Zhang 398f272c775SHong Zhang ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr); 39985e2c93fSHong Zhang 40085e2c93fSHong Zhang if (A->factortype == MAT_FACTOR_LU) { 40185e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS) 40285e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 40385e2c93fSHong Zhang #else 4048b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info)); 40585e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve"); 40685e2c93fSHong Zhang #endif 40785e2c93fSHong Zhang } else if (A->factortype == MAT_FACTOR_CHOLESKY) { 40885e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS) 40985e2c93fSHong Zhang SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 41085e2c93fSHong Zhang #else 4118b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info)); 41285e2c93fSHong Zhang if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve"); 41385e2c93fSHong Zhang #endif 4142205254eSKarl Rupp } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 41585e2c93fSHong Zhang 4168c778c55SBarry Smith ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr); 4178c778c55SBarry Smith ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr); 41885e2c93fSHong Zhang ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr); 41985e2c93fSHong Zhang PetscFunctionReturn(0); 42085e2c93fSHong Zhang } 42185e2c93fSHong Zhang 42285e2c93fSHong Zhang #undef __FUNCT__ 4234a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense" 424e0877f53SBarry Smith static PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 425da3a660dSBarry Smith { 426c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 427dfbe8321SBarry Smith PetscErrorCode ierr; 428f1ceaac6SMatthew G. Knepley const PetscScalar *x; 429f1ceaac6SMatthew G. Knepley PetscScalar *y; 430c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 43167e560aaSBarry Smith 4323a40ed3dSBarry Smith PetscFunctionBegin; 433c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 434f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4351ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 436d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 437752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 438da3a660dSBarry Smith if (mat->pivots) { 439ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 440e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 441ae7cfcebSSatish Balay #else 4428b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 443e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 444ae7cfcebSSatish Balay #endif 4457a97a34bSBarry Smith } else { 446ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 447e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 448ae7cfcebSSatish Balay #else 4498b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 450e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve"); 451ae7cfcebSSatish Balay #endif 452da3a660dSBarry Smith } 453f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 4541ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 455dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 4563a40ed3dSBarry Smith PetscFunctionReturn(0); 457da3a660dSBarry Smith } 4586ee01492SSatish Balay 4594a2ae208SSatish Balay #undef __FUNCT__ 4604a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense" 461e0877f53SBarry Smith static PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 462da3a660dSBarry Smith { 463c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 464dfbe8321SBarry Smith PetscErrorCode ierr; 465f1ceaac6SMatthew G. Knepley const PetscScalar *x; 466f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 467da3a660dSBarry Smith Vec tmp = 0; 468c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 46967e560aaSBarry Smith 4703a40ed3dSBarry Smith PetscFunctionBegin; 471c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 472f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 4731ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 474d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 475da3a660dSBarry Smith if (yy == zz) { 47678b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 4773bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 47878b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 479da3a660dSBarry Smith } 480d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 481752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 482da3a660dSBarry Smith if (mat->pivots) { 483ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 484e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 485ae7cfcebSSatish Balay #else 4868b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 487e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 488ae7cfcebSSatish Balay #endif 489a8c6a408SBarry Smith } else { 490ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 491e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 492ae7cfcebSSatish Balay #else 4938b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 494e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 495ae7cfcebSSatish Balay #endif 496da3a660dSBarry Smith } 4976bf464f9SBarry Smith if (tmp) { 4986bf464f9SBarry Smith ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 4996bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 5006bf464f9SBarry Smith } else { 5016bf464f9SBarry Smith ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 5026bf464f9SBarry Smith } 503f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 5041ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 505dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 5063a40ed3dSBarry Smith PetscFunctionReturn(0); 507da3a660dSBarry Smith } 50867e560aaSBarry Smith 5094a2ae208SSatish Balay #undef __FUNCT__ 5104a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense" 511e0877f53SBarry Smith static PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 512da3a660dSBarry Smith { 513c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 5146849ba73SBarry Smith PetscErrorCode ierr; 515f1ceaac6SMatthew G. Knepley const PetscScalar *x; 516f1ceaac6SMatthew G. Knepley PetscScalar *y,sone = 1.0; 51789ae1891SBarry Smith Vec tmp = NULL; 518c5df96a5SBarry Smith PetscBLASInt one = 1,info,m; 51967e560aaSBarry Smith 5203a40ed3dSBarry Smith PetscFunctionBegin; 521c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 522d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 523f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 5241ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 525da3a660dSBarry Smith if (yy == zz) { 52678b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 5273bb1ff40SBarry Smith ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr); 52878b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 529da3a660dSBarry Smith } 530d0f46423SBarry Smith ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 531752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 532da3a660dSBarry Smith if (mat->pivots) { 533ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 534e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 535ae7cfcebSSatish Balay #else 5368b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info)); 537e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 538ae7cfcebSSatish Balay #endif 5393a40ed3dSBarry Smith } else { 540ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 541e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 542ae7cfcebSSatish Balay #else 5438b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info)); 544e32f2f54SBarry Smith if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve"); 545ae7cfcebSSatish Balay #endif 546da3a660dSBarry Smith } 54790f02eecSBarry Smith if (tmp) { 5482dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 5496bf464f9SBarry Smith ierr = VecDestroy(&tmp);CHKERRQ(ierr); 5503a40ed3dSBarry Smith } else { 5512dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 55290f02eecSBarry Smith } 553f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 5541ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 555dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr); 5563a40ed3dSBarry Smith PetscFunctionReturn(0); 557da3a660dSBarry Smith } 558db4efbfdSBarry Smith 559db4efbfdSBarry Smith /* ---------------------------------------------------------------*/ 560db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 561db4efbfdSBarry Smith rather than put it in the Mat->row slot.*/ 562db4efbfdSBarry Smith #undef __FUNCT__ 563db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense" 564e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo) 565db4efbfdSBarry Smith { 566db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 567db4efbfdSBarry Smith PetscFunctionBegin; 568e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 569db4efbfdSBarry Smith #else 570db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 571db4efbfdSBarry Smith PetscErrorCode ierr; 572db4efbfdSBarry Smith PetscBLASInt n,m,info; 573db4efbfdSBarry Smith 574db4efbfdSBarry Smith PetscFunctionBegin; 575c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 576c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 577db4efbfdSBarry Smith if (!mat->pivots) { 578854ce69bSBarry Smith ierr = PetscMalloc1(A->rmap->n+1,&mat->pivots);CHKERRQ(ierr); 5793bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr); 580db4efbfdSBarry Smith } 581db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 5828e57ea43SSatish Balay ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr); 5838b83055fSJed Brown PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info)); 5848e57ea43SSatish Balay ierr = PetscFPTrapPop();CHKERRQ(ierr); 5858e57ea43SSatish Balay 586e32f2f54SBarry Smith if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization"); 587e32f2f54SBarry Smith if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 588db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 589db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 590db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 591db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 592d5f3da31SBarry Smith A->factortype = MAT_FACTOR_LU; 593db4efbfdSBarry Smith 594f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 595f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 596f6224b95SHong Zhang 597dc0b31edSSatish Balay ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr); 598db4efbfdSBarry Smith #endif 599db4efbfdSBarry Smith PetscFunctionReturn(0); 600db4efbfdSBarry Smith } 601db4efbfdSBarry Smith 602db4efbfdSBarry Smith #undef __FUNCT__ 603db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense" 604e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo) 605db4efbfdSBarry Smith { 606db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 607db4efbfdSBarry Smith PetscFunctionBegin; 608e32f2f54SBarry Smith SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 609db4efbfdSBarry Smith #else 610db4efbfdSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 611db4efbfdSBarry Smith PetscErrorCode ierr; 612c5df96a5SBarry Smith PetscBLASInt info,n; 613db4efbfdSBarry Smith 614db4efbfdSBarry Smith PetscFunctionBegin; 615c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 616db4efbfdSBarry Smith ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 617db4efbfdSBarry Smith 618db4efbfdSBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 6198b83055fSJed Brown PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info)); 620e32f2f54SBarry Smith if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 621db4efbfdSBarry Smith A->ops->solve = MatSolve_SeqDense; 622db4efbfdSBarry Smith A->ops->solvetranspose = MatSolveTranspose_SeqDense; 623db4efbfdSBarry Smith A->ops->solveadd = MatSolveAdd_SeqDense; 624db4efbfdSBarry Smith A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense; 625d5f3da31SBarry Smith A->factortype = MAT_FACTOR_CHOLESKY; 6262205254eSKarl Rupp 627f6224b95SHong Zhang ierr = PetscFree(A->solvertype);CHKERRQ(ierr); 628f6224b95SHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&A->solvertype);CHKERRQ(ierr); 629f6224b95SHong Zhang 630eb3f19e4SBarry Smith ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr); 631db4efbfdSBarry Smith #endif 632db4efbfdSBarry Smith PetscFunctionReturn(0); 633db4efbfdSBarry Smith } 634db4efbfdSBarry Smith 635db4efbfdSBarry Smith 636db4efbfdSBarry Smith #undef __FUNCT__ 637db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense" 6380481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy) 639db4efbfdSBarry Smith { 640db4efbfdSBarry Smith PetscErrorCode ierr; 641db4efbfdSBarry Smith MatFactorInfo info; 642db4efbfdSBarry Smith 643db4efbfdSBarry Smith PetscFunctionBegin; 644db4efbfdSBarry Smith info.fill = 1.0; 6452205254eSKarl Rupp 646c3ef05f6SHong Zhang ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr); 647719d5645SBarry Smith ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr); 648db4efbfdSBarry Smith PetscFunctionReturn(0); 649db4efbfdSBarry Smith } 650db4efbfdSBarry Smith 651db4efbfdSBarry Smith #undef __FUNCT__ 652db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense" 653e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info) 654db4efbfdSBarry Smith { 655db4efbfdSBarry Smith PetscFunctionBegin; 656c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 6571bbcc794SSatish Balay fact->preallocated = PETSC_TRUE; 658719d5645SBarry Smith fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense; 659db4efbfdSBarry Smith PetscFunctionReturn(0); 660db4efbfdSBarry Smith } 661db4efbfdSBarry Smith 662db4efbfdSBarry Smith #undef __FUNCT__ 663db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense" 664e0877f53SBarry Smith static PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info) 665db4efbfdSBarry Smith { 666db4efbfdSBarry Smith PetscFunctionBegin; 667b66fe19dSMatthew G Knepley fact->preallocated = PETSC_TRUE; 668c3ef05f6SHong Zhang fact->assembled = PETSC_TRUE; 669719d5645SBarry Smith fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense; 670db4efbfdSBarry Smith PetscFunctionReturn(0); 671db4efbfdSBarry Smith } 672db4efbfdSBarry Smith 673db4efbfdSBarry Smith #undef __FUNCT__ 674db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc" 675cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact) 676db4efbfdSBarry Smith { 677db4efbfdSBarry Smith PetscErrorCode ierr; 678db4efbfdSBarry Smith 679db4efbfdSBarry Smith PetscFunctionBegin; 680ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr); 681db4efbfdSBarry Smith ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 682db4efbfdSBarry Smith ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr); 683db4efbfdSBarry Smith if (ftype == MAT_FACTOR_LU) { 684db4efbfdSBarry Smith (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense; 685db4efbfdSBarry Smith } else { 686db4efbfdSBarry Smith (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense; 687db4efbfdSBarry Smith } 688d5f3da31SBarry Smith (*fact)->factortype = ftype; 68900c67f3bSHong Zhang 69000c67f3bSHong Zhang ierr = PetscFree((*fact)->solvertype);CHKERRQ(ierr); 69100c67f3bSHong Zhang ierr = PetscStrallocpy(MATSOLVERPETSC,&(*fact)->solvertype);CHKERRQ(ierr); 692db4efbfdSBarry Smith PetscFunctionReturn(0); 693db4efbfdSBarry Smith } 694db4efbfdSBarry Smith 695289bc588SBarry Smith /* ------------------------------------------------------------------*/ 6964a2ae208SSatish Balay #undef __FUNCT__ 69741f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense" 698e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 699289bc588SBarry Smith { 700c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 701d9ca1df4SBarry Smith PetscScalar *x,*v = mat->v,zero = 0.0,xt; 702d9ca1df4SBarry Smith const PetscScalar *b; 703dfbe8321SBarry Smith PetscErrorCode ierr; 704d0f46423SBarry Smith PetscInt m = A->rmap->n,i; 705c5df96a5SBarry Smith PetscBLASInt o = 1,bm; 706289bc588SBarry Smith 7073a40ed3dSBarry Smith PetscFunctionBegin; 708422a814eSBarry Smith if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */ 709c5df96a5SBarry Smith ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr); 710289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 71171044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 7122dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 713289bc588SBarry Smith } 7141ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 715d9ca1df4SBarry Smith ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr); 716b965ef7fSBarry Smith its = its*lits; 717e32f2f54SBarry 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); 718289bc588SBarry Smith while (its--) { 719fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) { 720289bc588SBarry Smith for (i=0; i<m; i++) { 7218b83055fSJed Brown PetscStackCallBLAS("BLASdot",xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o)); 72255a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 723289bc588SBarry Smith } 724289bc588SBarry Smith } 725fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) { 726289bc588SBarry Smith for (i=m-1; i>=0; i--) { 7278b83055fSJed Brown PetscStackCallBLAS("BLASdot",xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o)); 72855a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 729289bc588SBarry Smith } 730289bc588SBarry Smith } 731289bc588SBarry Smith } 732d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr); 7331ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 7343a40ed3dSBarry Smith PetscFunctionReturn(0); 735289bc588SBarry Smith } 736289bc588SBarry Smith 737289bc588SBarry Smith /* -----------------------------------------------------------------*/ 7384a2ae208SSatish Balay #undef __FUNCT__ 7394a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense" 740cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 741289bc588SBarry Smith { 742c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 743d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 744d9ca1df4SBarry Smith PetscScalar *y; 745dfbe8321SBarry Smith PetscErrorCode ierr; 7460805154bSBarry Smith PetscBLASInt m, n,_One=1; 747ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 7483a40ed3dSBarry Smith 7493a40ed3dSBarry Smith PetscFunctionBegin; 750c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 751c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 752d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 753d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 7541ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 7558b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One)); 756d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 7571ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 758dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr); 7593a40ed3dSBarry Smith PetscFunctionReturn(0); 760289bc588SBarry Smith } 761800995b7SMatthew Knepley 7624a2ae208SSatish Balay #undef __FUNCT__ 7634a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense" 764cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 765289bc588SBarry Smith { 766c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 767d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0,_DZero=0.0; 768dfbe8321SBarry Smith PetscErrorCode ierr; 7690805154bSBarry Smith PetscBLASInt m, n, _One=1; 770d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 7713a40ed3dSBarry Smith 7723a40ed3dSBarry Smith PetscFunctionBegin; 773c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 774c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 775d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 776d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 7771ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 7788b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One)); 779d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 7801ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 781dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr); 7823a40ed3dSBarry Smith PetscFunctionReturn(0); 783289bc588SBarry Smith } 7846ee01492SSatish Balay 7854a2ae208SSatish Balay #undef __FUNCT__ 7864a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense" 787cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 788289bc588SBarry Smith { 789c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 790d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 791d9ca1df4SBarry Smith PetscScalar *y,_DOne=1.0; 792dfbe8321SBarry Smith PetscErrorCode ierr; 7930805154bSBarry Smith PetscBLASInt m, n, _One=1; 7943a40ed3dSBarry Smith 7953a40ed3dSBarry Smith PetscFunctionBegin; 796c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 797c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 798d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 799600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 800d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8011ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 8028b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 803d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8041ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 805dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 8063a40ed3dSBarry Smith PetscFunctionReturn(0); 807289bc588SBarry Smith } 8086ee01492SSatish Balay 8094a2ae208SSatish Balay #undef __FUNCT__ 8104a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense" 811e0877f53SBarry Smith static PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 812289bc588SBarry Smith { 813c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 814d9ca1df4SBarry Smith const PetscScalar *v = mat->v,*x; 815d9ca1df4SBarry Smith PetscScalar *y; 816dfbe8321SBarry Smith PetscErrorCode ierr; 8170805154bSBarry Smith PetscBLASInt m, n, _One=1; 81887828ca2SBarry Smith PetscScalar _DOne=1.0; 8193a40ed3dSBarry Smith 8203a40ed3dSBarry Smith PetscFunctionBegin; 821c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 822c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr); 823d0f46423SBarry Smith if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0); 824600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 825d9ca1df4SBarry Smith ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr); 8261ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 8278b83055fSJed Brown PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One)); 828d9ca1df4SBarry Smith ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr); 8291ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 830dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr); 8313a40ed3dSBarry Smith PetscFunctionReturn(0); 832289bc588SBarry Smith } 833289bc588SBarry Smith 834289bc588SBarry Smith /* -----------------------------------------------------------------*/ 8354a2ae208SSatish Balay #undef __FUNCT__ 8364a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense" 837e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 838289bc588SBarry Smith { 839c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 84087828ca2SBarry Smith PetscScalar *v; 8416849ba73SBarry Smith PetscErrorCode ierr; 84213f74950SBarry Smith PetscInt i; 84367e560aaSBarry Smith 8443a40ed3dSBarry Smith PetscFunctionBegin; 845d0f46423SBarry Smith *ncols = A->cmap->n; 846289bc588SBarry Smith if (cols) { 847854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr); 848d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) (*cols)[i] = i; 849289bc588SBarry Smith } 850289bc588SBarry Smith if (vals) { 851854ce69bSBarry Smith ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr); 852289bc588SBarry Smith v = mat->v + row; 853d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;} 854289bc588SBarry Smith } 8553a40ed3dSBarry Smith PetscFunctionReturn(0); 856289bc588SBarry Smith } 8576ee01492SSatish Balay 8584a2ae208SSatish Balay #undef __FUNCT__ 8594a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense" 860e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 861289bc588SBarry Smith { 862dfbe8321SBarry Smith PetscErrorCode ierr; 8636e111a19SKarl Rupp 864606d414cSSatish Balay PetscFunctionBegin; 865606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 866606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 8673a40ed3dSBarry Smith PetscFunctionReturn(0); 868289bc588SBarry Smith } 869289bc588SBarry Smith /* ----------------------------------------------------------------*/ 8704a2ae208SSatish Balay #undef __FUNCT__ 8714a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense" 872e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 873289bc588SBarry Smith { 874c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 87513f74950SBarry Smith PetscInt i,j,idx=0; 876d6dfbf8fSBarry Smith 8773a40ed3dSBarry Smith PetscFunctionBegin; 878289bc588SBarry Smith if (!mat->roworiented) { 879dbb450caSBarry Smith if (addv == INSERT_VALUES) { 880289bc588SBarry Smith for (j=0; j<n; j++) { 881cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 8822515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 883e32f2f54SBarry 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); 88458804f6dSBarry Smith #endif 885289bc588SBarry Smith for (i=0; i<m; i++) { 886cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 8872515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 888e32f2f54SBarry 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); 88958804f6dSBarry Smith #endif 890cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 891289bc588SBarry Smith } 892289bc588SBarry Smith } 8933a40ed3dSBarry Smith } else { 894289bc588SBarry Smith for (j=0; j<n; j++) { 895cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 8962515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 897e32f2f54SBarry 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); 89858804f6dSBarry Smith #endif 899289bc588SBarry Smith for (i=0; i<m; i++) { 900cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 9012515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 902e32f2f54SBarry 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); 90358804f6dSBarry Smith #endif 904cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 905289bc588SBarry Smith } 906289bc588SBarry Smith } 907289bc588SBarry Smith } 9083a40ed3dSBarry Smith } else { 909dbb450caSBarry Smith if (addv == INSERT_VALUES) { 910e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 911cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 9122515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 913e32f2f54SBarry 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); 91458804f6dSBarry Smith #endif 915e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 916cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 9172515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 918e32f2f54SBarry 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); 91958804f6dSBarry Smith #endif 920cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 921e8d4e0b9SBarry Smith } 922e8d4e0b9SBarry Smith } 9233a40ed3dSBarry Smith } else { 924289bc588SBarry Smith for (i=0; i<m; i++) { 925cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 9262515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 927e32f2f54SBarry 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); 92858804f6dSBarry Smith #endif 929289bc588SBarry Smith for (j=0; j<n; j++) { 930cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 9312515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 932e32f2f54SBarry 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); 93358804f6dSBarry Smith #endif 934cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 935289bc588SBarry Smith } 936289bc588SBarry Smith } 937289bc588SBarry Smith } 938e8d4e0b9SBarry Smith } 9393a40ed3dSBarry Smith PetscFunctionReturn(0); 940289bc588SBarry Smith } 941e8d4e0b9SBarry Smith 9424a2ae208SSatish Balay #undef __FUNCT__ 9434a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense" 944e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 945ae80bb75SLois Curfman McInnes { 946ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 94713f74950SBarry Smith PetscInt i,j; 948ae80bb75SLois Curfman McInnes 9493a40ed3dSBarry Smith PetscFunctionBegin; 950ae80bb75SLois Curfman McInnes /* row-oriented output */ 951ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 95297e567efSBarry Smith if (indexm[i] < 0) {v += n;continue;} 953e32f2f54SBarry 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); 954ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 9556f31f424SBarry Smith if (indexn[j] < 0) {v++; continue;} 956e32f2f54SBarry 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); 95797e567efSBarry Smith *v++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 958ae80bb75SLois Curfman McInnes } 959ae80bb75SLois Curfman McInnes } 9603a40ed3dSBarry Smith PetscFunctionReturn(0); 961ae80bb75SLois Curfman McInnes } 962ae80bb75SLois Curfman McInnes 963289bc588SBarry Smith /* -----------------------------------------------------------------*/ 964289bc588SBarry Smith 9654a2ae208SSatish Balay #undef __FUNCT__ 9665bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense" 967e0877f53SBarry Smith static PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer) 968aabbc4fbSShri Abhyankar { 969aabbc4fbSShri Abhyankar Mat_SeqDense *a; 970aabbc4fbSShri Abhyankar PetscErrorCode ierr; 971aabbc4fbSShri Abhyankar PetscInt *scols,i,j,nz,header[4]; 972aabbc4fbSShri Abhyankar int fd; 973aabbc4fbSShri Abhyankar PetscMPIInt size; 974aabbc4fbSShri Abhyankar PetscInt *rowlengths = 0,M,N,*cols,grows,gcols; 975aabbc4fbSShri Abhyankar PetscScalar *vals,*svals,*v,*w; 976ce94432eSBarry Smith MPI_Comm comm; 977aabbc4fbSShri Abhyankar 978aabbc4fbSShri Abhyankar PetscFunctionBegin; 979c98fd787SBarry Smith /* force binary viewer to load .info file if it has not yet done so */ 980c98fd787SBarry Smith ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr); 981ce94432eSBarry Smith ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr); 982aabbc4fbSShri Abhyankar ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 983aabbc4fbSShri Abhyankar if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor"); 984aabbc4fbSShri Abhyankar ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 985aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 986aabbc4fbSShri Abhyankar if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 987aabbc4fbSShri Abhyankar M = header[1]; N = header[2]; nz = header[3]; 988aabbc4fbSShri Abhyankar 989aabbc4fbSShri Abhyankar /* set global size if not set already*/ 990aabbc4fbSShri Abhyankar if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) { 991aabbc4fbSShri Abhyankar ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr); 992aabbc4fbSShri Abhyankar } else { 993aabbc4fbSShri Abhyankar /* if sizes and type are already set, check if the vector global sizes are correct */ 994aabbc4fbSShri Abhyankar ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr); 995aabbc4fbSShri 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); 996aabbc4fbSShri Abhyankar } 997e6324fbbSBarry Smith a = (Mat_SeqDense*)newmat->data; 998e6324fbbSBarry Smith if (!a->user_alloc) { 9990298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1000e6324fbbSBarry Smith } 1001aabbc4fbSShri Abhyankar 1002aabbc4fbSShri Abhyankar if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 1003aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 1004aabbc4fbSShri Abhyankar v = a->v; 1005aabbc4fbSShri Abhyankar /* Allocate some temp space to read in the values and then flip them 1006aabbc4fbSShri Abhyankar from row major to column major */ 1007854ce69bSBarry Smith ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr); 1008aabbc4fbSShri Abhyankar /* read in nonzero values */ 1009aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 1010aabbc4fbSShri Abhyankar /* now flip the values and store them in the matrix*/ 1011aabbc4fbSShri Abhyankar for (j=0; j<N; j++) { 1012aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 1013aabbc4fbSShri Abhyankar *v++ =w[i*N+j]; 1014aabbc4fbSShri Abhyankar } 1015aabbc4fbSShri Abhyankar } 1016aabbc4fbSShri Abhyankar ierr = PetscFree(w);CHKERRQ(ierr); 1017aabbc4fbSShri Abhyankar } else { 1018aabbc4fbSShri Abhyankar /* read row lengths */ 1019854ce69bSBarry Smith ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr); 1020aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 1021aabbc4fbSShri Abhyankar 1022aabbc4fbSShri Abhyankar a = (Mat_SeqDense*)newmat->data; 1023aabbc4fbSShri Abhyankar v = a->v; 1024aabbc4fbSShri Abhyankar 1025aabbc4fbSShri Abhyankar /* read column indices and nonzeros */ 1026854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr); 1027aabbc4fbSShri Abhyankar cols = scols; 1028aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 1029854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr); 1030aabbc4fbSShri Abhyankar vals = svals; 1031aabbc4fbSShri Abhyankar ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 1032aabbc4fbSShri Abhyankar 1033aabbc4fbSShri Abhyankar /* insert into matrix */ 1034aabbc4fbSShri Abhyankar for (i=0; i<M; i++) { 1035aabbc4fbSShri Abhyankar for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 1036aabbc4fbSShri Abhyankar svals += rowlengths[i]; scols += rowlengths[i]; 1037aabbc4fbSShri Abhyankar } 1038aabbc4fbSShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1039aabbc4fbSShri Abhyankar ierr = PetscFree(cols);CHKERRQ(ierr); 1040aabbc4fbSShri Abhyankar ierr = PetscFree(rowlengths);CHKERRQ(ierr); 1041aabbc4fbSShri Abhyankar } 1042aabbc4fbSShri Abhyankar ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1043aabbc4fbSShri Abhyankar ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1044aabbc4fbSShri Abhyankar PetscFunctionReturn(0); 1045aabbc4fbSShri Abhyankar } 1046aabbc4fbSShri Abhyankar 1047aabbc4fbSShri Abhyankar #undef __FUNCT__ 10484a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII" 10496849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 1050289bc588SBarry Smith { 1051932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1052dfbe8321SBarry Smith PetscErrorCode ierr; 105313f74950SBarry Smith PetscInt i,j; 10542dcb1b2aSMatthew Knepley const char *name; 105587828ca2SBarry Smith PetscScalar *v; 1056f3ef73ceSBarry Smith PetscViewerFormat format; 10575f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 1058ace3abfcSBarry Smith PetscBool allreal = PETSC_TRUE; 10595f481a85SSatish Balay #endif 1060932b0c3eSLois Curfman McInnes 10613a40ed3dSBarry Smith PetscFunctionBegin; 1062b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1063456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 10643a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 1065fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 1066d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1067d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 106844cd7ae7SLois Curfman McInnes v = a->v + i; 106977431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 1070d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1071aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1072329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 107357622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 1074329f5518SBarry Smith } else if (PetscRealPart(*v)) { 107557622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr); 10766831982aSBarry Smith } 107780cd9d93SLois Curfman McInnes #else 10786831982aSBarry Smith if (*v) { 107957622a8eSBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr); 10806831982aSBarry Smith } 108180cd9d93SLois Curfman McInnes #endif 10821b807ce4Svictorle v += a->lda; 108380cd9d93SLois Curfman McInnes } 1084b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 108580cd9d93SLois Curfman McInnes } 1086d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 10873a40ed3dSBarry Smith } else { 1088d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr); 1089aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 109047989497SBarry Smith /* determine if matrix has all real values */ 109147989497SBarry Smith v = a->v; 1092d0f46423SBarry Smith for (i=0; i<A->rmap->n*A->cmap->n; i++) { 1093ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;} 109447989497SBarry Smith } 109547989497SBarry Smith #endif 1096fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 10973a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 1098d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1099d0f46423SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr); 1100fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 1101ffac6cdbSBarry Smith } 1102ffac6cdbSBarry Smith 1103d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 1104932b0c3eSLois Curfman McInnes v = a->v + i; 1105d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1106aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 110747989497SBarry Smith if (allreal) { 1108c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr); 110947989497SBarry Smith } else { 1110c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr); 111147989497SBarry Smith } 1112289bc588SBarry Smith #else 1113c61cd2faSJed Brown ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr); 1114289bc588SBarry Smith #endif 11151b807ce4Svictorle v += a->lda; 1116289bc588SBarry Smith } 1117b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 1118289bc588SBarry Smith } 1119fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 1120b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 1121ffac6cdbSBarry Smith } 1122d00279f6SBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr); 1123da3a660dSBarry Smith } 1124b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 11253a40ed3dSBarry Smith PetscFunctionReturn(0); 1126289bc588SBarry Smith } 1127289bc588SBarry Smith 11284a2ae208SSatish Balay #undef __FUNCT__ 11294a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary" 11306849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 1131932b0c3eSLois Curfman McInnes { 1132932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 11336849ba73SBarry Smith PetscErrorCode ierr; 113413f74950SBarry Smith int fd; 1135d0f46423SBarry Smith PetscInt ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n; 1136f4403165SShri Abhyankar PetscScalar *v,*anonz,*vals; 1137f4403165SShri Abhyankar PetscViewerFormat format; 1138932b0c3eSLois Curfman McInnes 11393a40ed3dSBarry Smith PetscFunctionBegin; 1140b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 114190ace30eSBarry Smith 1142f4403165SShri Abhyankar ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1143f4403165SShri Abhyankar if (format == PETSC_VIEWER_NATIVE) { 1144f4403165SShri Abhyankar /* store the matrix as a dense matrix */ 1145785e854fSJed Brown ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr); 11462205254eSKarl Rupp 1147f4403165SShri Abhyankar col_lens[0] = MAT_FILE_CLASSID; 1148f4403165SShri Abhyankar col_lens[1] = m; 1149f4403165SShri Abhyankar col_lens[2] = n; 1150f4403165SShri Abhyankar col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 11512205254eSKarl Rupp 1152f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1153f4403165SShri Abhyankar ierr = PetscFree(col_lens);CHKERRQ(ierr); 1154f4403165SShri Abhyankar 1155f4403165SShri Abhyankar /* write out matrix, by rows */ 1156854ce69bSBarry Smith ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr); 1157f4403165SShri Abhyankar v = a->v; 1158f4403165SShri Abhyankar for (j=0; j<n; j++) { 1159f4403165SShri Abhyankar for (i=0; i<m; i++) { 1160f4403165SShri Abhyankar vals[j + i*n] = *v++; 1161f4403165SShri Abhyankar } 1162f4403165SShri Abhyankar } 1163f4403165SShri Abhyankar ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1164f4403165SShri Abhyankar ierr = PetscFree(vals);CHKERRQ(ierr); 1165f4403165SShri Abhyankar } else { 1166854ce69bSBarry Smith ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr); 11672205254eSKarl Rupp 11680700a824SBarry Smith col_lens[0] = MAT_FILE_CLASSID; 1169932b0c3eSLois Curfman McInnes col_lens[1] = m; 1170932b0c3eSLois Curfman McInnes col_lens[2] = n; 1171932b0c3eSLois Curfman McInnes col_lens[3] = nz; 1172932b0c3eSLois Curfman McInnes 1173932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 1174932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 11756f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 1176932b0c3eSLois Curfman McInnes 1177932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 1178932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 1179932b0c3eSLois Curfman McInnes ict = 0; 1180932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1181932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 1182932b0c3eSLois Curfman McInnes } 11836f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 1184606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 1185932b0c3eSLois Curfman McInnes 1186932b0c3eSLois Curfman McInnes /* store nonzero values */ 1187854ce69bSBarry Smith ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr); 1188932b0c3eSLois Curfman McInnes ict = 0; 1189932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 1190932b0c3eSLois Curfman McInnes v = a->v + i; 1191932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 11921b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 1193932b0c3eSLois Curfman McInnes } 1194932b0c3eSLois Curfman McInnes } 11956f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 1196606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 1197f4403165SShri Abhyankar } 11983a40ed3dSBarry Smith PetscFunctionReturn(0); 1199932b0c3eSLois Curfman McInnes } 1200932b0c3eSLois Curfman McInnes 12019804daf3SBarry Smith #include <petscdraw.h> 12024a2ae208SSatish Balay #undef __FUNCT__ 12034a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom" 1204e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 1205f1af5d2fSBarry Smith { 1206f1af5d2fSBarry Smith Mat A = (Mat) Aa; 1207f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 12086849ba73SBarry Smith PetscErrorCode ierr; 1209383922c3SLisandro Dalcin PetscInt m = A->rmap->n,n = A->cmap->n,i,j; 1210383922c3SLisandro Dalcin int color = PETSC_DRAW_WHITE; 121187828ca2SBarry Smith PetscScalar *v = a->v; 1212b0a32e0cSBarry Smith PetscViewer viewer; 1213b05fc000SLisandro Dalcin PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r; 1214f3ef73ceSBarry Smith PetscViewerFormat format; 1215f1af5d2fSBarry Smith 1216f1af5d2fSBarry Smith PetscFunctionBegin; 1217f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 1218b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 1219b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 1220f1af5d2fSBarry Smith 1221f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 1222383922c3SLisandro Dalcin 1223fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 1224383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1225f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 1226f1af5d2fSBarry Smith for (j = 0; j < n; j++) { 1227383922c3SLisandro Dalcin x_l = j; x_r = x_l + 1.0; 1228f1af5d2fSBarry Smith for (i = 0; i < m; i++) { 1229f1af5d2fSBarry Smith y_l = m - i - 1.0; 1230f1af5d2fSBarry Smith y_r = y_l + 1.0; 1231329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 1232b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 1233329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 1234b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 1235f1af5d2fSBarry Smith } else { 1236f1af5d2fSBarry Smith continue; 1237f1af5d2fSBarry Smith } 1238b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1239f1af5d2fSBarry Smith } 1240f1af5d2fSBarry Smith } 1241383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1242f1af5d2fSBarry Smith } else { 1243f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 1244f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 1245b05fc000SLisandro Dalcin PetscReal minv = 0.0, maxv = 0.0; 1246b05fc000SLisandro Dalcin PetscDraw popup; 1247b05fc000SLisandro Dalcin 1248f1af5d2fSBarry Smith for (i=0; i < m*n; i++) { 1249f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 1250f1af5d2fSBarry Smith } 1251383922c3SLisandro Dalcin if (minv >= maxv) maxv = minv + PETSC_SMALL; 1252b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 125345f3bb6eSLisandro Dalcin ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr); 1254383922c3SLisandro Dalcin 1255383922c3SLisandro Dalcin ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr); 1256f1af5d2fSBarry Smith for (j=0; j<n; j++) { 1257f1af5d2fSBarry Smith x_l = j; 1258f1af5d2fSBarry Smith x_r = x_l + 1.0; 1259f1af5d2fSBarry Smith for (i=0; i<m; i++) { 1260f1af5d2fSBarry Smith y_l = m - i - 1.0; 1261f1af5d2fSBarry Smith y_r = y_l + 1.0; 1262b05fc000SLisandro Dalcin color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv); 1263b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 1264f1af5d2fSBarry Smith } 1265f1af5d2fSBarry Smith } 1266383922c3SLisandro Dalcin ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr); 1267f1af5d2fSBarry Smith } 1268f1af5d2fSBarry Smith PetscFunctionReturn(0); 1269f1af5d2fSBarry Smith } 1270f1af5d2fSBarry Smith 12714a2ae208SSatish Balay #undef __FUNCT__ 12724a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 1273e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 1274f1af5d2fSBarry Smith { 1275b0a32e0cSBarry Smith PetscDraw draw; 1276ace3abfcSBarry Smith PetscBool isnull; 1277329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 1278dfbe8321SBarry Smith PetscErrorCode ierr; 1279f1af5d2fSBarry Smith 1280f1af5d2fSBarry Smith PetscFunctionBegin; 1281b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1282b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1283abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1284f1af5d2fSBarry Smith 1285d0f46423SBarry Smith xr = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0; 1286f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1287b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1288832b7cebSLisandro Dalcin ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1289b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 12900298fd71SBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr); 1291832b7cebSLisandro Dalcin ierr = PetscDrawSave(draw);CHKERRQ(ierr); 1292f1af5d2fSBarry Smith PetscFunctionReturn(0); 1293f1af5d2fSBarry Smith } 1294f1af5d2fSBarry Smith 12954a2ae208SSatish Balay #undef __FUNCT__ 12964a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 1297dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1298932b0c3eSLois Curfman McInnes { 1299dfbe8321SBarry Smith PetscErrorCode ierr; 1300ace3abfcSBarry Smith PetscBool iascii,isbinary,isdraw; 1301932b0c3eSLois Curfman McInnes 13023a40ed3dSBarry Smith PetscFunctionBegin; 1303251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr); 1304251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr); 1305251f4c67SDmitry Karpeev ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr); 13060f5bd95cSBarry Smith 1307c45a1595SBarry Smith if (iascii) { 1308c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 13090f5bd95cSBarry Smith } else if (isbinary) { 13103a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1311f1af5d2fSBarry Smith } else if (isdraw) { 1312f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 1313932b0c3eSLois Curfman McInnes } 13143a40ed3dSBarry Smith PetscFunctionReturn(0); 1315932b0c3eSLois Curfman McInnes } 1316289bc588SBarry Smith 13174a2ae208SSatish Balay #undef __FUNCT__ 13184a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1319e0877f53SBarry Smith static PetscErrorCode MatDestroy_SeqDense(Mat mat) 1320289bc588SBarry Smith { 1321ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1322dfbe8321SBarry Smith PetscErrorCode ierr; 132390f02eecSBarry Smith 13243a40ed3dSBarry Smith PetscFunctionBegin; 1325aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1326d0f46423SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n); 1327a5a9c739SBarry Smith #endif 132805b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 1329abc3b08eSStefano Zampini ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr); 13306857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1331bf0cc555SLisandro Dalcin ierr = PetscFree(mat->data);CHKERRQ(ierr); 1332dbd8c25aSHong Zhang 1333dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1334bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr); 1335bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr); 13368baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr); 13378baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 13388baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr); 13398baccfbdSHong Zhang #endif 1340bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr); 1341bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1342bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1343bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 1344abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 13453bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 13463bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 13473bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr); 13483a40ed3dSBarry Smith PetscFunctionReturn(0); 1349289bc588SBarry Smith } 1350289bc588SBarry Smith 13514a2ae208SSatish Balay #undef __FUNCT__ 13524a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1353e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout) 1354289bc588SBarry Smith { 1355c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 13566849ba73SBarry Smith PetscErrorCode ierr; 135713f74950SBarry Smith PetscInt k,j,m,n,M; 135887828ca2SBarry Smith PetscScalar *v,tmp; 135948b35521SBarry Smith 13603a40ed3dSBarry Smith PetscFunctionBegin; 1361d0f46423SBarry Smith v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n; 1362*cf37664fSBarry Smith if (reuse == MAT_INPLACE_MATRIX) { /* in place transpose */ 1363e7e72b3dSBarry Smith if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1364e7e72b3dSBarry Smith else { 1365d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1366289bc588SBarry Smith for (k=0; k<j; k++) { 13671b807ce4Svictorle tmp = v[j + k*M]; 13681b807ce4Svictorle v[j + k*M] = v[k + j*M]; 13691b807ce4Svictorle v[k + j*M] = tmp; 1370289bc588SBarry Smith } 1371289bc588SBarry Smith } 1372d64ed03dSBarry Smith } 13733a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1374d3e5ee88SLois Curfman McInnes Mat tmat; 1375ec8511deSBarry Smith Mat_SeqDense *tmatd; 137687828ca2SBarry Smith PetscScalar *v2; 1377af36a384SStefano Zampini PetscInt M2; 1378ea709b57SSatish Balay 1379fc4dec0aSBarry Smith if (reuse == MAT_INITIAL_MATRIX) { 1380ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr); 1381d0f46423SBarry Smith ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr); 13827adad957SLisandro Dalcin ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 13830298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr); 1384fc4dec0aSBarry Smith } else { 1385fc4dec0aSBarry Smith tmat = *matout; 1386fc4dec0aSBarry Smith } 1387ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 1388af36a384SStefano Zampini v = mat->v; v2 = tmatd->v; M2 = tmatd->lda; 1389d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 1390af36a384SStefano Zampini for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M]; 1391d3e5ee88SLois Curfman McInnes } 13926d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 13936d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1394d3e5ee88SLois Curfman McInnes *matout = tmat; 139548b35521SBarry Smith } 13963a40ed3dSBarry Smith PetscFunctionReturn(0); 1397289bc588SBarry Smith } 1398289bc588SBarry Smith 13994a2ae208SSatish Balay #undef __FUNCT__ 14004a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1401e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool *flg) 1402289bc588SBarry Smith { 1403c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1404c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 140513f74950SBarry Smith PetscInt i,j; 1406a2ea699eSBarry Smith PetscScalar *v1,*v2; 14079ea5d5aeSSatish Balay 14083a40ed3dSBarry Smith PetscFunctionBegin; 1409d0f46423SBarry Smith if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1410d0f46423SBarry Smith if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1411d0f46423SBarry Smith for (i=0; i<A1->rmap->n; i++) { 14121b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1413d0f46423SBarry Smith for (j=0; j<A1->cmap->n; j++) { 14143a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 14151b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 14161b807ce4Svictorle } 1417289bc588SBarry Smith } 141877c4ece6SBarry Smith *flg = PETSC_TRUE; 14193a40ed3dSBarry Smith PetscFunctionReturn(0); 1420289bc588SBarry Smith } 1421289bc588SBarry Smith 14224a2ae208SSatish Balay #undef __FUNCT__ 14234a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1424e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1425289bc588SBarry Smith { 1426c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1427dfbe8321SBarry Smith PetscErrorCode ierr; 142813f74950SBarry Smith PetscInt i,n,len; 142987828ca2SBarry Smith PetscScalar *x,zero = 0.0; 143044cd7ae7SLois Curfman McInnes 14313a40ed3dSBarry Smith PetscFunctionBegin; 14322dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 14337a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 14341ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1435d0f46423SBarry Smith len = PetscMin(A->rmap->n,A->cmap->n); 1436e32f2f54SBarry Smith if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 143744cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 14381b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1439289bc588SBarry Smith } 14401ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 14413a40ed3dSBarry Smith PetscFunctionReturn(0); 1442289bc588SBarry Smith } 1443289bc588SBarry Smith 14444a2ae208SSatish Balay #undef __FUNCT__ 14454a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1446e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1447289bc588SBarry Smith { 1448c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1449f1ceaac6SMatthew G. Knepley const PetscScalar *l,*r; 1450f1ceaac6SMatthew G. Knepley PetscScalar x,*v; 1451dfbe8321SBarry Smith PetscErrorCode ierr; 1452d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n; 145355659b69SBarry Smith 14543a40ed3dSBarry Smith PetscFunctionBegin; 145528988994SBarry Smith if (ll) { 14567a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 1457f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr); 1458e32f2f54SBarry Smith if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1459da3a660dSBarry Smith for (i=0; i<m; i++) { 1460da3a660dSBarry Smith x = l[i]; 1461da3a660dSBarry Smith v = mat->v + i; 1462b43bac26SStefano Zampini for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;} 1463da3a660dSBarry Smith } 1464f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr); 1465eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1466da3a660dSBarry Smith } 146728988994SBarry Smith if (rr) { 14687a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 1469f1ceaac6SMatthew G. Knepley ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr); 1470e32f2f54SBarry Smith if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1471da3a660dSBarry Smith for (i=0; i<n; i++) { 1472da3a660dSBarry Smith x = r[i]; 1473b43bac26SStefano Zampini v = mat->v + i*mat->lda; 14742205254eSKarl Rupp for (j=0; j<m; j++) (*v++) *= x; 1475da3a660dSBarry Smith } 1476f1ceaac6SMatthew G. Knepley ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr); 1477eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr); 1478da3a660dSBarry Smith } 14793a40ed3dSBarry Smith PetscFunctionReturn(0); 1480289bc588SBarry Smith } 1481289bc588SBarry Smith 14824a2ae208SSatish Balay #undef __FUNCT__ 14834a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1484e0877f53SBarry Smith static PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1485289bc588SBarry Smith { 1486c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 148787828ca2SBarry Smith PetscScalar *v = mat->v; 1488329f5518SBarry Smith PetscReal sum = 0.0; 1489d0f46423SBarry Smith PetscInt lda =mat->lda,m=A->rmap->n,i,j; 1490efee365bSSatish Balay PetscErrorCode ierr; 149155659b69SBarry Smith 14923a40ed3dSBarry Smith PetscFunctionBegin; 1493289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1494a5ce6ee0Svictorle if (lda>m) { 1495d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1496a5ce6ee0Svictorle v = mat->v+j*lda; 1497a5ce6ee0Svictorle for (i=0; i<m; i++) { 1498a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1499a5ce6ee0Svictorle } 1500a5ce6ee0Svictorle } 1501a5ce6ee0Svictorle } else { 1502570b7f6dSBarry Smith #if defined(PETSC_USE_REAL___FP16) 1503570b7f6dSBarry Smith PetscBLASInt one = 1,cnt = A->cmap->n*A->rmap->n; 1504570b7f6dSBarry Smith *nrm = BLASnrm2_(&cnt,v,&one); 1505570b7f6dSBarry Smith } 1506570b7f6dSBarry Smith #else 1507d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1508329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1509289bc588SBarry Smith } 1510a5ce6ee0Svictorle } 15118f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1512570b7f6dSBarry Smith #endif 1513dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 15143a40ed3dSBarry Smith } else if (type == NORM_1) { 1515064f8208SBarry Smith *nrm = 0.0; 1516d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 15171b807ce4Svictorle v = mat->v + j*mat->lda; 1518289bc588SBarry Smith sum = 0.0; 1519d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 152033a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1521289bc588SBarry Smith } 1522064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1523289bc588SBarry Smith } 1524eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 15253a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1526064f8208SBarry Smith *nrm = 0.0; 1527d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1528289bc588SBarry Smith v = mat->v + j; 1529289bc588SBarry Smith sum = 0.0; 1530d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 15311b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1532289bc588SBarry Smith } 1533064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1534289bc588SBarry Smith } 1535eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1536e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 15373a40ed3dSBarry Smith PetscFunctionReturn(0); 1538289bc588SBarry Smith } 1539289bc588SBarry Smith 15404a2ae208SSatish Balay #undef __FUNCT__ 15414a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1542e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1543289bc588SBarry Smith { 1544c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 154563ba0a88SBarry Smith PetscErrorCode ierr; 154667e560aaSBarry Smith 15473a40ed3dSBarry Smith PetscFunctionBegin; 1548b5a2b587SKris Buschelman switch (op) { 1549b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 15504e0d8c25SBarry Smith aij->roworiented = flg; 1551b5a2b587SKris Buschelman break; 1552512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1553b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 15543971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 15554e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 155613fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1557b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1558b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 15595021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 15605021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 15615021d80fSJed Brown break; 15625021d80fSJed Brown case MAT_SPD: 156377e54ba9SKris Buschelman case MAT_SYMMETRIC: 156477e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 15659a4540c5SBarry Smith case MAT_HERMITIAN: 15669a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 15675021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 156877e54ba9SKris Buschelman break; 1569b5a2b587SKris Buschelman default: 1570e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 15713a40ed3dSBarry Smith } 15723a40ed3dSBarry Smith PetscFunctionReturn(0); 1573289bc588SBarry Smith } 1574289bc588SBarry Smith 15754a2ae208SSatish Balay #undef __FUNCT__ 15764a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1577e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A) 15786f0a148fSBarry Smith { 1579ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 15806849ba73SBarry Smith PetscErrorCode ierr; 1581d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 15823a40ed3dSBarry Smith 15833a40ed3dSBarry Smith PetscFunctionBegin; 1584a5ce6ee0Svictorle if (lda>m) { 1585d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1586a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1587a5ce6ee0Svictorle } 1588a5ce6ee0Svictorle } else { 1589d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1590a5ce6ee0Svictorle } 15913a40ed3dSBarry Smith PetscFunctionReturn(0); 15926f0a148fSBarry Smith } 15936f0a148fSBarry Smith 15944a2ae208SSatish Balay #undef __FUNCT__ 15954a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 1596e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 15976f0a148fSBarry Smith { 159897b48c8fSBarry Smith PetscErrorCode ierr; 1599ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1600b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 160197b48c8fSBarry Smith PetscScalar *slot,*bb; 160297b48c8fSBarry Smith const PetscScalar *xx; 160355659b69SBarry Smith 16043a40ed3dSBarry Smith PetscFunctionBegin; 1605b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1606b9679d65SBarry Smith for (i=0; i<N; i++) { 1607b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1608b9679d65SBarry 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); 1609b9679d65SBarry Smith } 1610b9679d65SBarry Smith #endif 1611b9679d65SBarry Smith 161297b48c8fSBarry Smith /* fix right hand side if needed */ 161397b48c8fSBarry Smith if (x && b) { 161497b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 161597b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 16162205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 161797b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 161897b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 161997b48c8fSBarry Smith } 162097b48c8fSBarry Smith 16216f0a148fSBarry Smith for (i=0; i<N; i++) { 16226f0a148fSBarry Smith slot = l->v + rows[i]; 1623b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 16246f0a148fSBarry Smith } 1625f4df32b1SMatthew Knepley if (diag != 0.0) { 1626b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 16276f0a148fSBarry Smith for (i=0; i<N; i++) { 1628b9679d65SBarry Smith slot = l->v + (m+1)*rows[i]; 1629f4df32b1SMatthew Knepley *slot = diag; 16306f0a148fSBarry Smith } 16316f0a148fSBarry Smith } 16323a40ed3dSBarry Smith PetscFunctionReturn(0); 16336f0a148fSBarry Smith } 1634557bce09SLois Curfman McInnes 16354a2ae208SSatish Balay #undef __FUNCT__ 16368c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense" 1637e0877f53SBarry Smith static PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[]) 163864e87e97SBarry Smith { 1639c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 16403a40ed3dSBarry Smith 16413a40ed3dSBarry Smith PetscFunctionBegin; 1642e32f2f54SBarry 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"); 164364e87e97SBarry Smith *array = mat->v; 16443a40ed3dSBarry Smith PetscFunctionReturn(0); 164564e87e97SBarry Smith } 16460754003eSLois Curfman McInnes 16474a2ae208SSatish Balay #undef __FUNCT__ 16488c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense" 1649e0877f53SBarry Smith static PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1650ff14e315SSatish Balay { 16513a40ed3dSBarry Smith PetscFunctionBegin; 165209b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 16533a40ed3dSBarry Smith PetscFunctionReturn(0); 1654ff14e315SSatish Balay } 16550754003eSLois Curfman McInnes 16564a2ae208SSatish Balay #undef __FUNCT__ 16578c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray" 1658dec5eb66SMatthew G Knepley /*@C 16598c778c55SBarry Smith MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored 166073a71a0fSBarry Smith 166173a71a0fSBarry Smith Not Collective 166273a71a0fSBarry Smith 166373a71a0fSBarry Smith Input Parameter: 1664579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 166573a71a0fSBarry Smith 166673a71a0fSBarry Smith Output Parameter: 166773a71a0fSBarry Smith . array - pointer to the data 166873a71a0fSBarry Smith 166973a71a0fSBarry Smith Level: intermediate 167073a71a0fSBarry Smith 16718c778c55SBarry Smith .seealso: MatDenseRestoreArray() 167273a71a0fSBarry Smith @*/ 16738c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 167473a71a0fSBarry Smith { 167573a71a0fSBarry Smith PetscErrorCode ierr; 167673a71a0fSBarry Smith 167773a71a0fSBarry Smith PetscFunctionBegin; 16788c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 167973a71a0fSBarry Smith PetscFunctionReturn(0); 168073a71a0fSBarry Smith } 168173a71a0fSBarry Smith 168273a71a0fSBarry Smith #undef __FUNCT__ 16838c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray" 1684dec5eb66SMatthew G Knepley /*@C 1685579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 168673a71a0fSBarry Smith 168773a71a0fSBarry Smith Not Collective 168873a71a0fSBarry Smith 168973a71a0fSBarry Smith Input Parameters: 1690579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 169173a71a0fSBarry Smith . array - pointer to the data 169273a71a0fSBarry Smith 169373a71a0fSBarry Smith Level: intermediate 169473a71a0fSBarry Smith 16958c778c55SBarry Smith .seealso: MatDenseGetArray() 169673a71a0fSBarry Smith @*/ 16978c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 169873a71a0fSBarry Smith { 169973a71a0fSBarry Smith PetscErrorCode ierr; 170073a71a0fSBarry Smith 170173a71a0fSBarry Smith PetscFunctionBegin; 17028c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 170373a71a0fSBarry Smith PetscFunctionReturn(0); 170473a71a0fSBarry Smith } 170573a71a0fSBarry Smith 170673a71a0fSBarry Smith #undef __FUNCT__ 17074a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 170813f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 17090754003eSLois Curfman McInnes { 1710c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 17116849ba73SBarry Smith PetscErrorCode ierr; 17125d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 17135d0c19d7SBarry Smith const PetscInt *irow,*icol; 171487828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 17150754003eSLois Curfman McInnes Mat newmat; 17160754003eSLois Curfman McInnes 17173a40ed3dSBarry Smith PetscFunctionBegin; 171878b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 171978b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1720e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1721e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 17220754003eSLois Curfman McInnes 1723182d2002SSatish Balay /* Check submatrixcall */ 1724182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 172513f74950SBarry Smith PetscInt n_cols,n_rows; 1726182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 172721a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1728f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1729c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 173021a2c019SBarry Smith } 1731182d2002SSatish Balay newmat = *B; 1732182d2002SSatish Balay } else { 17330754003eSLois Curfman McInnes /* Create and fill new matrix */ 1734ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 1735f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 17367adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 17370298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1738182d2002SSatish Balay } 1739182d2002SSatish Balay 1740182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1741182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1742182d2002SSatish Balay 1743182d2002SSatish Balay for (i=0; i<ncols; i++) { 17446de62eeeSBarry Smith av = v + mat->lda*icol[i]; 17452205254eSKarl Rupp for (j=0; j<nrows; j++) *bv++ = av[irow[j]]; 17460754003eSLois Curfman McInnes } 1747182d2002SSatish Balay 1748182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 17496d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 17506d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 17510754003eSLois Curfman McInnes 17520754003eSLois Curfman McInnes /* Free work space */ 175378b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 175478b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1755182d2002SSatish Balay *B = newmat; 17563a40ed3dSBarry Smith PetscFunctionReturn(0); 17570754003eSLois Curfman McInnes } 17580754003eSLois Curfman McInnes 17594a2ae208SSatish Balay #undef __FUNCT__ 17604a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 1761e0877f53SBarry Smith static PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1762905e6a2fSBarry Smith { 17636849ba73SBarry Smith PetscErrorCode ierr; 176413f74950SBarry Smith PetscInt i; 1765905e6a2fSBarry Smith 17663a40ed3dSBarry Smith PetscFunctionBegin; 1767905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1768854ce69bSBarry Smith ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr); 1769905e6a2fSBarry Smith } 1770905e6a2fSBarry Smith 1771905e6a2fSBarry Smith for (i=0; i<n; i++) { 17726a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1773905e6a2fSBarry Smith } 17743a40ed3dSBarry Smith PetscFunctionReturn(0); 1775905e6a2fSBarry Smith } 1776905e6a2fSBarry Smith 17774a2ae208SSatish Balay #undef __FUNCT__ 1778c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1779e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1780c0aa2d19SHong Zhang { 1781c0aa2d19SHong Zhang PetscFunctionBegin; 1782c0aa2d19SHong Zhang PetscFunctionReturn(0); 1783c0aa2d19SHong Zhang } 1784c0aa2d19SHong Zhang 1785c0aa2d19SHong Zhang #undef __FUNCT__ 1786c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1787e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1788c0aa2d19SHong Zhang { 1789c0aa2d19SHong Zhang PetscFunctionBegin; 1790c0aa2d19SHong Zhang PetscFunctionReturn(0); 1791c0aa2d19SHong Zhang } 1792c0aa2d19SHong Zhang 1793c0aa2d19SHong Zhang #undef __FUNCT__ 17944a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1795e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 17964b0e389bSBarry Smith { 17974b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 17986849ba73SBarry Smith PetscErrorCode ierr; 1799d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 18003a40ed3dSBarry Smith 18013a40ed3dSBarry Smith PetscFunctionBegin; 180233f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 180333f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1804cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 18053a40ed3dSBarry Smith PetscFunctionReturn(0); 18063a40ed3dSBarry Smith } 1807e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1808a5ce6ee0Svictorle if (lda1>m || lda2>m) { 18090dbb7854Svictorle for (j=0; j<n; j++) { 1810a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1811a5ce6ee0Svictorle } 1812a5ce6ee0Svictorle } else { 1813d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1814a5ce6ee0Svictorle } 1815273d9f13SBarry Smith PetscFunctionReturn(0); 1816273d9f13SBarry Smith } 1817273d9f13SBarry Smith 18184a2ae208SSatish Balay #undef __FUNCT__ 18194994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense" 1820e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A) 1821273d9f13SBarry Smith { 1822dfbe8321SBarry Smith PetscErrorCode ierr; 1823273d9f13SBarry Smith 1824273d9f13SBarry Smith PetscFunctionBegin; 1825273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 18263a40ed3dSBarry Smith PetscFunctionReturn(0); 18274b0e389bSBarry Smith } 18284b0e389bSBarry Smith 1829284134d9SBarry Smith #undef __FUNCT__ 1830ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense" 1831ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1832ba337c44SJed Brown { 1833ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1834ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1835ba337c44SJed Brown PetscScalar *aa = a->v; 1836ba337c44SJed Brown 1837ba337c44SJed Brown PetscFunctionBegin; 1838ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1839ba337c44SJed Brown PetscFunctionReturn(0); 1840ba337c44SJed Brown } 1841ba337c44SJed Brown 1842ba337c44SJed Brown #undef __FUNCT__ 1843ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense" 1844ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1845ba337c44SJed Brown { 1846ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1847ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1848ba337c44SJed Brown PetscScalar *aa = a->v; 1849ba337c44SJed Brown 1850ba337c44SJed Brown PetscFunctionBegin; 1851ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1852ba337c44SJed Brown PetscFunctionReturn(0); 1853ba337c44SJed Brown } 1854ba337c44SJed Brown 1855ba337c44SJed Brown #undef __FUNCT__ 1856ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense" 1857ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 1858ba337c44SJed Brown { 1859ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1860ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1861ba337c44SJed Brown PetscScalar *aa = a->v; 1862ba337c44SJed Brown 1863ba337c44SJed Brown PetscFunctionBegin; 1864ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 1865ba337c44SJed Brown PetscFunctionReturn(0); 1866ba337c44SJed Brown } 1867284134d9SBarry Smith 1868a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1869a9fe9ddaSSatish Balay #undef __FUNCT__ 1870a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1871150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1872a9fe9ddaSSatish Balay { 1873a9fe9ddaSSatish Balay PetscErrorCode ierr; 1874a9fe9ddaSSatish Balay 1875a9fe9ddaSSatish Balay PetscFunctionBegin; 1876a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 18773ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1878a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 18793ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1880a9fe9ddaSSatish Balay } 18813ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1882a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 18833ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1884a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1885a9fe9ddaSSatish Balay } 1886a9fe9ddaSSatish Balay 1887a9fe9ddaSSatish Balay #undef __FUNCT__ 1888a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1889a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1890a9fe9ddaSSatish Balay { 1891ee16a9a1SHong Zhang PetscErrorCode ierr; 1892d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1893ee16a9a1SHong Zhang Mat Cmat; 1894a9fe9ddaSSatish Balay 1895ee16a9a1SHong Zhang PetscFunctionBegin; 1896e32f2f54SBarry 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); 1897ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1898ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1899ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 19000298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 1901d73949e8SHong Zhang 1902ee16a9a1SHong Zhang *C = Cmat; 1903ee16a9a1SHong Zhang PetscFunctionReturn(0); 1904ee16a9a1SHong Zhang } 1905a9fe9ddaSSatish Balay 190698a3b096SSatish Balay #undef __FUNCT__ 1907a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1908a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1909a9fe9ddaSSatish Balay { 1910a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1911a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1912a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 19130805154bSBarry Smith PetscBLASInt m,n,k; 1914a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1915c5df96a5SBarry Smith PetscErrorCode ierr; 1916fd4e9aacSBarry Smith PetscBool flg; 1917a9fe9ddaSSatish Balay 1918a9fe9ddaSSatish Balay PetscFunctionBegin; 1919fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr); 1920fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense"); 1921fd4e9aacSBarry Smith 1922fd4e9aacSBarry Smith /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/ 1923fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr); 1924fd4e9aacSBarry Smith if (flg) { 1925fd4e9aacSBarry Smith C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense; 1926fd4e9aacSBarry Smith ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr); 1927fd4e9aacSBarry Smith PetscFunctionReturn(0); 1928fd4e9aacSBarry Smith } 1929fd4e9aacSBarry Smith 1930fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr); 1931fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense"); 1932c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1933c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1934c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 19355ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1936a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1937a9fe9ddaSSatish Balay } 1938a9fe9ddaSSatish Balay 1939a9fe9ddaSSatish Balay #undef __FUNCT__ 194075648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense" 194175648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1942a9fe9ddaSSatish Balay { 1943a9fe9ddaSSatish Balay PetscErrorCode ierr; 1944a9fe9ddaSSatish Balay 1945a9fe9ddaSSatish Balay PetscFunctionBegin; 1946a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 19473ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 194875648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 19493ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1950a9fe9ddaSSatish Balay } 19513ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 195275648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 19533ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1954a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1955a9fe9ddaSSatish Balay } 1956a9fe9ddaSSatish Balay 1957a9fe9ddaSSatish Balay #undef __FUNCT__ 195875648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense" 195975648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1960a9fe9ddaSSatish Balay { 1961ee16a9a1SHong Zhang PetscErrorCode ierr; 1962d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1963ee16a9a1SHong Zhang Mat Cmat; 1964a9fe9ddaSSatish Balay 1965ee16a9a1SHong Zhang PetscFunctionBegin; 1966e32f2f54SBarry 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); 1967ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1968ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1969ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 19700298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 19712205254eSKarl Rupp 1972ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 19732205254eSKarl Rupp 1974ee16a9a1SHong Zhang *C = Cmat; 1975ee16a9a1SHong Zhang PetscFunctionReturn(0); 1976ee16a9a1SHong Zhang } 1977a9fe9ddaSSatish Balay 1978a9fe9ddaSSatish Balay #undef __FUNCT__ 197975648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense" 198075648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1981a9fe9ddaSSatish Balay { 1982a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1983a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1984a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 19850805154bSBarry Smith PetscBLASInt m,n,k; 1986a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1987c5df96a5SBarry Smith PetscErrorCode ierr; 1988a9fe9ddaSSatish Balay 1989a9fe9ddaSSatish Balay PetscFunctionBegin; 1990c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr); 1991c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1992c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 19932fbe02b9SBarry Smith /* 19942fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 19952fbe02b9SBarry Smith */ 19965ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1997a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1998a9fe9ddaSSatish Balay } 1999985db425SBarry Smith 2000985db425SBarry Smith #undef __FUNCT__ 2001985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 2002e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 2003985db425SBarry Smith { 2004985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2005985db425SBarry Smith PetscErrorCode ierr; 2006d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2007985db425SBarry Smith PetscScalar *x; 2008985db425SBarry Smith MatScalar *aa = a->v; 2009985db425SBarry Smith 2010985db425SBarry Smith PetscFunctionBegin; 2011e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2012985db425SBarry Smith 2013985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2014985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2015985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2016e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2017985db425SBarry Smith for (i=0; i<m; i++) { 2018985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2019985db425SBarry Smith for (j=1; j<n; j++) { 2020985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 2021985db425SBarry Smith } 2022985db425SBarry Smith } 2023985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2024985db425SBarry Smith PetscFunctionReturn(0); 2025985db425SBarry Smith } 2026985db425SBarry Smith 2027985db425SBarry Smith #undef __FUNCT__ 2028985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 2029e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 2030985db425SBarry Smith { 2031985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2032985db425SBarry Smith PetscErrorCode ierr; 2033d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2034985db425SBarry Smith PetscScalar *x; 2035985db425SBarry Smith PetscReal atmp; 2036985db425SBarry Smith MatScalar *aa = a->v; 2037985db425SBarry Smith 2038985db425SBarry Smith PetscFunctionBegin; 2039e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2040985db425SBarry Smith 2041985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2042985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2043985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2044e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2045985db425SBarry Smith for (i=0; i<m; i++) { 20469189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 2047985db425SBarry Smith for (j=1; j<n; j++) { 2048985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 2049985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 2050985db425SBarry Smith } 2051985db425SBarry Smith } 2052985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2053985db425SBarry Smith PetscFunctionReturn(0); 2054985db425SBarry Smith } 2055985db425SBarry Smith 2056985db425SBarry Smith #undef __FUNCT__ 2057985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 2058e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 2059985db425SBarry Smith { 2060985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2061985db425SBarry Smith PetscErrorCode ierr; 2062d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2063985db425SBarry Smith PetscScalar *x; 2064985db425SBarry Smith MatScalar *aa = a->v; 2065985db425SBarry Smith 2066985db425SBarry Smith PetscFunctionBegin; 2067e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2068985db425SBarry Smith 2069985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2070985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2071985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2072e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2073985db425SBarry Smith for (i=0; i<m; i++) { 2074985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2075985db425SBarry Smith for (j=1; j<n; j++) { 2076985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 2077985db425SBarry Smith } 2078985db425SBarry Smith } 2079985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2080985db425SBarry Smith PetscFunctionReturn(0); 2081985db425SBarry Smith } 2082985db425SBarry Smith 20838d0534beSBarry Smith #undef __FUNCT__ 20848d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 2085e0877f53SBarry Smith static PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 20868d0534beSBarry Smith { 20878d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 20888d0534beSBarry Smith PetscErrorCode ierr; 20898d0534beSBarry Smith PetscScalar *x; 20908d0534beSBarry Smith 20918d0534beSBarry Smith PetscFunctionBegin; 2092e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 20938d0534beSBarry Smith 20948d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2095d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 20968d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 20978d0534beSBarry Smith PetscFunctionReturn(0); 20988d0534beSBarry Smith } 20998d0534beSBarry Smith 21000716a85fSBarry Smith 21010716a85fSBarry Smith #undef __FUNCT__ 21020716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense" 21030716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 21040716a85fSBarry Smith { 21050716a85fSBarry Smith PetscErrorCode ierr; 21060716a85fSBarry Smith PetscInt i,j,m,n; 21070716a85fSBarry Smith PetscScalar *a; 21080716a85fSBarry Smith 21090716a85fSBarry Smith PetscFunctionBegin; 21100716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 21110716a85fSBarry Smith ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); 21128c778c55SBarry Smith ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr); 21130716a85fSBarry Smith if (type == NORM_2) { 21140716a85fSBarry Smith for (i=0; i<n; i++) { 21150716a85fSBarry Smith for (j=0; j<m; j++) { 21160716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 21170716a85fSBarry Smith } 21180716a85fSBarry Smith a += m; 21190716a85fSBarry Smith } 21200716a85fSBarry Smith } else if (type == NORM_1) { 21210716a85fSBarry Smith for (i=0; i<n; i++) { 21220716a85fSBarry Smith for (j=0; j<m; j++) { 21230716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 21240716a85fSBarry Smith } 21250716a85fSBarry Smith a += m; 21260716a85fSBarry Smith } 21270716a85fSBarry Smith } else if (type == NORM_INFINITY) { 21280716a85fSBarry Smith for (i=0; i<n; i++) { 21290716a85fSBarry Smith for (j=0; j<m; j++) { 21300716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 21310716a85fSBarry Smith } 21320716a85fSBarry Smith a += m; 21330716a85fSBarry Smith } 2134ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 21358c778c55SBarry Smith ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr); 21360716a85fSBarry Smith if (type == NORM_2) { 21378f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 21380716a85fSBarry Smith } 21390716a85fSBarry Smith PetscFunctionReturn(0); 21400716a85fSBarry Smith } 21410716a85fSBarry Smith 214273a71a0fSBarry Smith #undef __FUNCT__ 214373a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense" 214473a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 214573a71a0fSBarry Smith { 214673a71a0fSBarry Smith PetscErrorCode ierr; 214773a71a0fSBarry Smith PetscScalar *a; 214873a71a0fSBarry Smith PetscInt m,n,i; 214973a71a0fSBarry Smith 215073a71a0fSBarry Smith PetscFunctionBegin; 215173a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 21528c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 215373a71a0fSBarry Smith for (i=0; i<m*n; i++) { 215473a71a0fSBarry Smith ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr); 215573a71a0fSBarry Smith } 21568c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 215773a71a0fSBarry Smith PetscFunctionReturn(0); 215873a71a0fSBarry Smith } 215973a71a0fSBarry Smith 21603b49f96aSBarry Smith #undef __FUNCT__ 21613b49f96aSBarry Smith #define __FUNCT__ "MatMissingDiagonal_SeqDense" 21623b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool *missing,PetscInt *d) 21633b49f96aSBarry Smith { 21643b49f96aSBarry Smith PetscFunctionBegin; 21653b49f96aSBarry Smith *missing = PETSC_FALSE; 21663b49f96aSBarry Smith PetscFunctionReturn(0); 21673b49f96aSBarry Smith } 216873a71a0fSBarry Smith 2169abc3b08eSStefano Zampini 2170289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2171a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2172905e6a2fSBarry Smith MatGetRow_SeqDense, 2173905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2174905e6a2fSBarry Smith MatMult_SeqDense, 217597304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 21767c922b88SBarry Smith MatMultTranspose_SeqDense, 21777c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2178db4efbfdSBarry Smith 0, 2179db4efbfdSBarry Smith 0, 2180db4efbfdSBarry Smith 0, 2181db4efbfdSBarry Smith /* 10*/ 0, 2182905e6a2fSBarry Smith MatLUFactor_SeqDense, 2183905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 218441f059aeSBarry Smith MatSOR_SeqDense, 2185ec8511deSBarry Smith MatTranspose_SeqDense, 218697304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2187905e6a2fSBarry Smith MatEqual_SeqDense, 2188905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2189905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2190905e6a2fSBarry Smith MatNorm_SeqDense, 2191c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2192c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2193905e6a2fSBarry Smith MatSetOption_SeqDense, 2194905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2195d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2196db4efbfdSBarry Smith 0, 2197db4efbfdSBarry Smith 0, 2198db4efbfdSBarry Smith 0, 2199db4efbfdSBarry Smith 0, 22004994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2201273d9f13SBarry Smith 0, 2202905e6a2fSBarry Smith 0, 220373a71a0fSBarry Smith 0, 220473a71a0fSBarry Smith 0, 2205d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2206a5ae1ecdSBarry Smith 0, 2207a5ae1ecdSBarry Smith 0, 2208a5ae1ecdSBarry Smith 0, 2209a5ae1ecdSBarry Smith 0, 2210d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 2211a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 2212a5ae1ecdSBarry Smith 0, 22134b0e389bSBarry Smith MatGetValues_SeqDense, 2214a5ae1ecdSBarry Smith MatCopy_SeqDense, 2215d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2216a5ae1ecdSBarry Smith MatScale_SeqDense, 22177d68702bSBarry Smith MatShift_Basic, 2218a5ae1ecdSBarry Smith 0, 22193f49a652SStefano Zampini MatZeroRowsColumns_SeqDense, 222073a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2221a5ae1ecdSBarry Smith 0, 2222a5ae1ecdSBarry Smith 0, 2223a5ae1ecdSBarry Smith 0, 2224a5ae1ecdSBarry Smith 0, 2225d519adbfSMatthew Knepley /* 54*/ 0, 2226a5ae1ecdSBarry Smith 0, 2227a5ae1ecdSBarry Smith 0, 2228a5ae1ecdSBarry Smith 0, 2229a5ae1ecdSBarry Smith 0, 2230d519adbfSMatthew Knepley /* 59*/ 0, 2231e03a110bSBarry Smith MatDestroy_SeqDense, 2232e03a110bSBarry Smith MatView_SeqDense, 2233357abbc8SBarry Smith 0, 223497304618SKris Buschelman 0, 2235d519adbfSMatthew Knepley /* 64*/ 0, 223697304618SKris Buschelman 0, 223797304618SKris Buschelman 0, 223897304618SKris Buschelman 0, 223997304618SKris Buschelman 0, 2240d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 224197304618SKris Buschelman 0, 224297304618SKris Buschelman 0, 224397304618SKris Buschelman 0, 224497304618SKris Buschelman 0, 2245d519adbfSMatthew Knepley /* 74*/ 0, 224697304618SKris Buschelman 0, 224797304618SKris Buschelman 0, 224897304618SKris Buschelman 0, 224997304618SKris Buschelman 0, 2250d519adbfSMatthew Knepley /* 79*/ 0, 225197304618SKris Buschelman 0, 225297304618SKris Buschelman 0, 225397304618SKris Buschelman 0, 22545bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2255865e5f61SKris Buschelman 0, 22561cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2257865e5f61SKris Buschelman 0, 2258865e5f61SKris Buschelman 0, 2259865e5f61SKris Buschelman 0, 2260d519adbfSMatthew Knepley /* 89*/ MatMatMult_SeqDense_SeqDense, 2261a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 2262a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2263abc3b08eSStefano Zampini MatPtAP_SeqDense_SeqDense, 2264abc3b08eSStefano Zampini MatPtAPSymbolic_SeqDense_SeqDense, 2265abc3b08eSStefano Zampini /* 94*/ MatPtAPNumeric_SeqDense_SeqDense, 22665df89d91SHong Zhang 0, 22675df89d91SHong Zhang 0, 22685df89d91SHong Zhang 0, 2269284134d9SBarry Smith 0, 2270d519adbfSMatthew Knepley /* 99*/ 0, 2271284134d9SBarry Smith 0, 2272284134d9SBarry Smith 0, 2273ba337c44SJed Brown MatConjugate_SeqDense, 2274f73d5cc4SBarry Smith 0, 2275ba337c44SJed Brown /*104*/ 0, 2276ba337c44SJed Brown MatRealPart_SeqDense, 2277ba337c44SJed Brown MatImaginaryPart_SeqDense, 2278985db425SBarry Smith 0, 2279985db425SBarry Smith 0, 228085e2c93fSHong Zhang /*109*/ MatMatSolve_SeqDense, 2281985db425SBarry Smith 0, 22828d0534beSBarry Smith MatGetRowMin_SeqDense, 2283aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 22843b49f96aSBarry Smith MatMissingDiagonal_SeqDense, 2285aabbc4fbSShri Abhyankar /*114*/ 0, 2286aabbc4fbSShri Abhyankar 0, 2287aabbc4fbSShri Abhyankar 0, 2288aabbc4fbSShri Abhyankar 0, 2289aabbc4fbSShri Abhyankar 0, 2290aabbc4fbSShri Abhyankar /*119*/ 0, 2291aabbc4fbSShri Abhyankar 0, 2292aabbc4fbSShri Abhyankar 0, 22930716a85fSBarry Smith 0, 22940716a85fSBarry Smith 0, 22950716a85fSBarry Smith /*124*/ 0, 22965df89d91SHong Zhang MatGetColumnNorms_SeqDense, 22975df89d91SHong Zhang 0, 22985df89d91SHong Zhang 0, 22995df89d91SHong Zhang 0, 23005df89d91SHong Zhang /*129*/ 0, 230175648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 230275648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 230375648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 23043964eb88SJed Brown 0, 23053964eb88SJed Brown /*134*/ 0, 23063964eb88SJed Brown 0, 23073964eb88SJed Brown 0, 23083964eb88SJed Brown 0, 23093964eb88SJed Brown 0, 23103964eb88SJed Brown /*139*/ 0, 2311f9426fe0SMark Adams 0, 23123964eb88SJed Brown 0 2313985db425SBarry Smith }; 231490ace30eSBarry Smith 23154a2ae208SSatish Balay #undef __FUNCT__ 23164a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 23174b828684SBarry Smith /*@C 2318fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2319d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2320d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2321289bc588SBarry Smith 2322db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2323db81eaa0SLois Curfman McInnes 232420563c6bSBarry Smith Input Parameters: 2325db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 23260c775827SLois Curfman McInnes . m - number of rows 232718f449edSLois Curfman McInnes . n - number of columns 23280298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2329dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 233020563c6bSBarry Smith 233120563c6bSBarry Smith Output Parameter: 233244cd7ae7SLois Curfman McInnes . A - the matrix 233320563c6bSBarry Smith 2334b259b22eSLois Curfman McInnes Notes: 233518f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 233618f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 23370298fd71SBarry Smith set data=NULL. 233818f449edSLois Curfman McInnes 2339027ccd11SLois Curfman McInnes Level: intermediate 2340027ccd11SLois Curfman McInnes 2341dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 2342d65003e9SLois Curfman McInnes 234369b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 234420563c6bSBarry Smith @*/ 23457087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2346289bc588SBarry Smith { 2347dfbe8321SBarry Smith PetscErrorCode ierr; 23483b2fbd54SBarry Smith 23493a40ed3dSBarry Smith PetscFunctionBegin; 2350f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2351f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2352273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2353273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2354273d9f13SBarry Smith PetscFunctionReturn(0); 2355273d9f13SBarry Smith } 2356273d9f13SBarry Smith 23574a2ae208SSatish Balay #undef __FUNCT__ 2358afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 2359273d9f13SBarry Smith /*@C 2360273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2361273d9f13SBarry Smith 2362273d9f13SBarry Smith Collective on MPI_Comm 2363273d9f13SBarry Smith 2364273d9f13SBarry Smith Input Parameters: 23651c4f3114SJed Brown + B - the matrix 23660298fd71SBarry Smith - data - the array (or NULL) 2367273d9f13SBarry Smith 2368273d9f13SBarry Smith Notes: 2369273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2370273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2371284134d9SBarry Smith need not call this routine. 2372273d9f13SBarry Smith 2373273d9f13SBarry Smith Level: intermediate 2374273d9f13SBarry Smith 2375273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2376273d9f13SBarry Smith 237769b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2378867c911aSBarry Smith 2379273d9f13SBarry Smith @*/ 23807087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2381273d9f13SBarry Smith { 23824ac538c5SBarry Smith PetscErrorCode ierr; 2383a23d5eceSKris Buschelman 2384a23d5eceSKris Buschelman PetscFunctionBegin; 23854ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2386a23d5eceSKris Buschelman PetscFunctionReturn(0); 2387a23d5eceSKris Buschelman } 2388a23d5eceSKris Buschelman 2389a23d5eceSKris Buschelman #undef __FUNCT__ 2390afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 23917087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2392a23d5eceSKris Buschelman { 2393273d9f13SBarry Smith Mat_SeqDense *b; 2394dfbe8321SBarry Smith PetscErrorCode ierr; 2395273d9f13SBarry Smith 2396273d9f13SBarry Smith PetscFunctionBegin; 2397273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2398a868139aSShri Abhyankar 239934ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 240034ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 240134ef9618SShri Abhyankar 2402273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 240386d161a7SShri Abhyankar b->Mmax = B->rmap->n; 240486d161a7SShri Abhyankar b->Nmax = B->cmap->n; 240586d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 240686d161a7SShri Abhyankar 2407220afb94SBarry Smith ierr = PetscIntMultError(b->lda,b->Nmax,NULL);CHKERRQ(ierr); 24089e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 24099e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2410e92229d0SSatish Balay ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr); 24113bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 24122205254eSKarl Rupp 24139e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2414273d9f13SBarry Smith } else { /* user-allocated storage */ 24159e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2416273d9f13SBarry Smith b->v = data; 2417273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2418273d9f13SBarry Smith } 24190450473dSBarry Smith B->assembled = PETSC_TRUE; 2420273d9f13SBarry Smith PetscFunctionReturn(0); 2421273d9f13SBarry Smith } 2422273d9f13SBarry Smith 242365b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 24241b807ce4Svictorle #undef __FUNCT__ 24258baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental" 2426cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 24278baccfbdSHong Zhang { 2428d77f618aSHong Zhang Mat mat_elemental; 2429d77f618aSHong Zhang PetscErrorCode ierr; 2430d77f618aSHong Zhang PetscScalar *array,*v_colwise; 2431d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 2432d77f618aSHong Zhang 24338baccfbdSHong Zhang PetscFunctionBegin; 2434d77f618aSHong Zhang ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr); 2435d77f618aSHong Zhang ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr); 2436d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 2437d77f618aSHong Zhang k = 0; 2438d77f618aSHong Zhang for (j=0; j<N; j++) { 2439d77f618aSHong Zhang cols[j] = j; 2440d77f618aSHong Zhang for (i=0; i<M; i++) { 2441d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 2442d77f618aSHong Zhang } 2443d77f618aSHong Zhang } 2444d77f618aSHong Zhang for (i=0; i<M; i++) { 2445d77f618aSHong Zhang rows[i] = i; 2446d77f618aSHong Zhang } 2447d77f618aSHong Zhang ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr); 2448d77f618aSHong Zhang 2449d77f618aSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr); 2450d77f618aSHong Zhang ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 2451d77f618aSHong Zhang ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr); 2452d77f618aSHong Zhang ierr = MatSetUp(mat_elemental);CHKERRQ(ierr); 2453d77f618aSHong Zhang 2454d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 2455d77f618aSHong Zhang ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr); 2456d77f618aSHong Zhang ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2457d77f618aSHong Zhang ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2458d77f618aSHong Zhang ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr); 2459d77f618aSHong Zhang 2460511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 246128be2f97SBarry Smith ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr); 2462d77f618aSHong Zhang } else { 2463d77f618aSHong Zhang *newmat = mat_elemental; 2464d77f618aSHong Zhang } 24658baccfbdSHong Zhang PetscFunctionReturn(0); 24668baccfbdSHong Zhang } 246765b80a83SHong Zhang #endif 24688baccfbdSHong Zhang 24698baccfbdSHong Zhang #undef __FUNCT__ 24701b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 24711b807ce4Svictorle /*@C 24721b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 24731b807ce4Svictorle 24741b807ce4Svictorle Input parameter: 24751b807ce4Svictorle + A - the matrix 24761b807ce4Svictorle - lda - the leading dimension 24771b807ce4Svictorle 24781b807ce4Svictorle Notes: 2479867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 24801b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 24811b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 24821b807ce4Svictorle 24831b807ce4Svictorle Level: intermediate 24841b807ce4Svictorle 24851b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 24861b807ce4Svictorle 2487284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2488867c911aSBarry Smith 24891b807ce4Svictorle @*/ 24907087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 24911b807ce4Svictorle { 24921b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 249321a2c019SBarry Smith 24941b807ce4Svictorle PetscFunctionBegin; 2495e32f2f54SBarry 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); 24961b807ce4Svictorle b->lda = lda; 249721a2c019SBarry Smith b->changelda = PETSC_FALSE; 249821a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 24991b807ce4Svictorle PetscFunctionReturn(0); 25001b807ce4Svictorle } 25011b807ce4Svictorle 25020bad9183SKris Buschelman /*MC 2503fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 25040bad9183SKris Buschelman 25050bad9183SKris Buschelman Options Database Keys: 25060bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 25070bad9183SKris Buschelman 25080bad9183SKris Buschelman Level: beginner 25090bad9183SKris Buschelman 251089665df3SBarry Smith .seealso: MatCreateSeqDense() 251189665df3SBarry Smith 25120bad9183SKris Buschelman M*/ 25130bad9183SKris Buschelman 25144a2ae208SSatish Balay #undef __FUNCT__ 25154a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 25168cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B) 2517273d9f13SBarry Smith { 2518273d9f13SBarry Smith Mat_SeqDense *b; 2519dfbe8321SBarry Smith PetscErrorCode ierr; 25207c334f02SBarry Smith PetscMPIInt size; 2521273d9f13SBarry Smith 2522273d9f13SBarry Smith PetscFunctionBegin; 2523ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 2524e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 252555659b69SBarry Smith 2526b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 2527549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 252844cd7ae7SLois Curfman McInnes B->data = (void*)b; 252918f449edSLois Curfman McInnes 253044cd7ae7SLois Curfman McInnes b->pivots = 0; 2531273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2532273d9f13SBarry Smith b->v = 0; 253321a2c019SBarry Smith b->changelda = PETSC_FALSE; 25344e220ebcSLois Curfman McInnes 2535bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 2536bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2537bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 25388baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 25398baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 25408baccfbdSHong Zhang #endif 2541bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 2542bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2543bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2544bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2545abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 25463bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 25473bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 25483bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 254917667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 25503a40ed3dSBarry Smith PetscFunctionReturn(0); 2551289bc588SBarry Smith } 2552