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 { 104*a13144ffSStefano 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; 110*a13144ffSStefano Zampini PetscBool isseqdense; 111b49cda9fSStefano Zampini 112b49cda9fSStefano Zampini PetscFunctionBegin; 113*a13144ffSStefano Zampini if (reuse == MAT_REUSE_MATRIX) { 114*a13144ffSStefano Zampini ierr = PetscObjectTypeCompare((PetscObject)*newmat,MATSEQDENSE,&isseqdense);CHKERRQ(ierr); 115*a13144ffSStefano Zampini if (!isseqdense) SETERRQ1(PetscObjectComm((PetscObject)*newmat),PETSC_ERR_USER,"Cannot reuse matrix of type %s",((PetscObject)(*newmat))->type); 116*a13144ffSStefano Zampini } 117*a13144ffSStefano 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); 123*a13144ffSStefano Zampini } else { 124*a13144ffSStefano Zampini b = (Mat_SeqDense*)((*newmat)->data); 125*a13144ffSStefano Zampini ierr = PetscMemzero(b->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr); 126*a13144ffSStefano 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) { 138*a13144ffSStefano Zampini ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 139*a13144ffSStefano Zampini ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 14028be2f97SBarry Smith ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr); 141b49cda9fSStefano Zampini } else { 142*a13144ffSStefano Zampini if (B) *newmat = B; 143*a13144ffSStefano Zampini ierr = MatAssemblyBegin(*newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 144*a13144ffSStefano 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; 1362e9695a30SBarry Smith if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* 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 { 1502d0f46423SBarry Smith for (i=0; i<A->cmap->n*A->rmap->n; i++) { 1503329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1504289bc588SBarry Smith } 1505a5ce6ee0Svictorle } 15068f1a2a5eSBarry Smith *nrm = PetscSqrtReal(sum); 1507dc0b31edSSatish Balay ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 15083a40ed3dSBarry Smith } else if (type == NORM_1) { 1509064f8208SBarry Smith *nrm = 0.0; 1510d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 15111b807ce4Svictorle v = mat->v + j*mat->lda; 1512289bc588SBarry Smith sum = 0.0; 1513d0f46423SBarry Smith for (i=0; i<A->rmap->n; i++) { 151433a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1515289bc588SBarry Smith } 1516064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1517289bc588SBarry Smith } 1518eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 15193a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1520064f8208SBarry Smith *nrm = 0.0; 1521d0f46423SBarry Smith for (j=0; j<A->rmap->n; j++) { 1522289bc588SBarry Smith v = mat->v + j; 1523289bc588SBarry Smith sum = 0.0; 1524d0f46423SBarry Smith for (i=0; i<A->cmap->n; i++) { 15251b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1526289bc588SBarry Smith } 1527064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1528289bc588SBarry Smith } 1529eb3f19e4SBarry Smith ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr); 1530e7e72b3dSBarry Smith } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm"); 15313a40ed3dSBarry Smith PetscFunctionReturn(0); 1532289bc588SBarry Smith } 1533289bc588SBarry Smith 15344a2ae208SSatish Balay #undef __FUNCT__ 15354a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1536e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg) 1537289bc588SBarry Smith { 1538c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 153963ba0a88SBarry Smith PetscErrorCode ierr; 154067e560aaSBarry Smith 15413a40ed3dSBarry Smith PetscFunctionBegin; 1542b5a2b587SKris Buschelman switch (op) { 1543b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 15444e0d8c25SBarry Smith aij->roworiented = flg; 1545b5a2b587SKris Buschelman break; 1546512a5fc5SBarry Smith case MAT_NEW_NONZERO_LOCATIONS: 1547b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 15483971808eSMatthew Knepley case MAT_NEW_NONZERO_ALLOCATION_ERR: 15494e0d8c25SBarry Smith case MAT_NEW_DIAGONALS: 155013fa8e87SLisandro Dalcin case MAT_KEEP_NONZERO_PATTERN: 1551b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1552b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 15535021d80fSJed Brown case MAT_IGNORE_LOWER_TRIANGULAR: 15545021d80fSJed Brown ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 15555021d80fSJed Brown break; 15565021d80fSJed Brown case MAT_SPD: 155777e54ba9SKris Buschelman case MAT_SYMMETRIC: 155877e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 15599a4540c5SBarry Smith case MAT_HERMITIAN: 15609a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 15615021d80fSJed Brown /* These options are handled directly by MatSetOption() */ 156277e54ba9SKris Buschelman break; 1563b5a2b587SKris Buschelman default: 1564e32f2f54SBarry Smith SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]); 15653a40ed3dSBarry Smith } 15663a40ed3dSBarry Smith PetscFunctionReturn(0); 1567289bc588SBarry Smith } 1568289bc588SBarry Smith 15694a2ae208SSatish Balay #undef __FUNCT__ 15704a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1571e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A) 15726f0a148fSBarry Smith { 1573ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 15746849ba73SBarry Smith PetscErrorCode ierr; 1575d0f46423SBarry Smith PetscInt lda=l->lda,m=A->rmap->n,j; 15763a40ed3dSBarry Smith 15773a40ed3dSBarry Smith PetscFunctionBegin; 1578a5ce6ee0Svictorle if (lda>m) { 1579d0f46423SBarry Smith for (j=0; j<A->cmap->n; j++) { 1580a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1581a5ce6ee0Svictorle } 1582a5ce6ee0Svictorle } else { 1583d0f46423SBarry Smith ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1584a5ce6ee0Svictorle } 15853a40ed3dSBarry Smith PetscFunctionReturn(0); 15866f0a148fSBarry Smith } 15876f0a148fSBarry Smith 15884a2ae208SSatish Balay #undef __FUNCT__ 15894a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 1590e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b) 15916f0a148fSBarry Smith { 159297b48c8fSBarry Smith PetscErrorCode ierr; 1593ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1594b9679d65SBarry Smith PetscInt m = l->lda, n = A->cmap->n, i,j; 159597b48c8fSBarry Smith PetscScalar *slot,*bb; 159697b48c8fSBarry Smith const PetscScalar *xx; 159755659b69SBarry Smith 15983a40ed3dSBarry Smith PetscFunctionBegin; 1599b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG) 1600b9679d65SBarry Smith for (i=0; i<N; i++) { 1601b9679d65SBarry Smith if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed"); 1602b9679d65SBarry 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); 1603b9679d65SBarry Smith } 1604b9679d65SBarry Smith #endif 1605b9679d65SBarry Smith 160697b48c8fSBarry Smith /* fix right hand side if needed */ 160797b48c8fSBarry Smith if (x && b) { 160897b48c8fSBarry Smith ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr); 160997b48c8fSBarry Smith ierr = VecGetArray(b,&bb);CHKERRQ(ierr); 16102205254eSKarl Rupp for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]]; 161197b48c8fSBarry Smith ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr); 161297b48c8fSBarry Smith ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr); 161397b48c8fSBarry Smith } 161497b48c8fSBarry Smith 16156f0a148fSBarry Smith for (i=0; i<N; i++) { 16166f0a148fSBarry Smith slot = l->v + rows[i]; 1617b9679d65SBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += m;} 16186f0a148fSBarry Smith } 1619f4df32b1SMatthew Knepley if (diag != 0.0) { 1620b9679d65SBarry Smith if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices"); 16216f0a148fSBarry Smith for (i=0; i<N; i++) { 1622b9679d65SBarry Smith slot = l->v + (m+1)*rows[i]; 1623f4df32b1SMatthew Knepley *slot = diag; 16246f0a148fSBarry Smith } 16256f0a148fSBarry Smith } 16263a40ed3dSBarry Smith PetscFunctionReturn(0); 16276f0a148fSBarry Smith } 1628557bce09SLois Curfman McInnes 16294a2ae208SSatish Balay #undef __FUNCT__ 16308c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense" 1631e0877f53SBarry Smith static PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[]) 163264e87e97SBarry Smith { 1633c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 16343a40ed3dSBarry Smith 16353a40ed3dSBarry Smith PetscFunctionBegin; 1636e32f2f54SBarry 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"); 163764e87e97SBarry Smith *array = mat->v; 16383a40ed3dSBarry Smith PetscFunctionReturn(0); 163964e87e97SBarry Smith } 16400754003eSLois Curfman McInnes 16414a2ae208SSatish Balay #undef __FUNCT__ 16428c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense" 1643e0877f53SBarry Smith static PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1644ff14e315SSatish Balay { 16453a40ed3dSBarry Smith PetscFunctionBegin; 164609b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 16473a40ed3dSBarry Smith PetscFunctionReturn(0); 1648ff14e315SSatish Balay } 16490754003eSLois Curfman McInnes 16504a2ae208SSatish Balay #undef __FUNCT__ 16518c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray" 1652dec5eb66SMatthew G Knepley /*@C 16538c778c55SBarry Smith MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored 165473a71a0fSBarry Smith 165573a71a0fSBarry Smith Not Collective 165673a71a0fSBarry Smith 165773a71a0fSBarry Smith Input Parameter: 1658579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 165973a71a0fSBarry Smith 166073a71a0fSBarry Smith Output Parameter: 166173a71a0fSBarry Smith . array - pointer to the data 166273a71a0fSBarry Smith 166373a71a0fSBarry Smith Level: intermediate 166473a71a0fSBarry Smith 16658c778c55SBarry Smith .seealso: MatDenseRestoreArray() 166673a71a0fSBarry Smith @*/ 16678c778c55SBarry Smith PetscErrorCode MatDenseGetArray(Mat A,PetscScalar **array) 166873a71a0fSBarry Smith { 166973a71a0fSBarry Smith PetscErrorCode ierr; 167073a71a0fSBarry Smith 167173a71a0fSBarry Smith PetscFunctionBegin; 16728c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 167373a71a0fSBarry Smith PetscFunctionReturn(0); 167473a71a0fSBarry Smith } 167573a71a0fSBarry Smith 167673a71a0fSBarry Smith #undef __FUNCT__ 16778c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray" 1678dec5eb66SMatthew G Knepley /*@C 1679579dbff0SBarry Smith MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray() 168073a71a0fSBarry Smith 168173a71a0fSBarry Smith Not Collective 168273a71a0fSBarry Smith 168373a71a0fSBarry Smith Input Parameters: 1684579dbff0SBarry Smith . mat - a MATSEQDENSE or MATMPIDENSE matrix 168573a71a0fSBarry Smith . array - pointer to the data 168673a71a0fSBarry Smith 168773a71a0fSBarry Smith Level: intermediate 168873a71a0fSBarry Smith 16898c778c55SBarry Smith .seealso: MatDenseGetArray() 169073a71a0fSBarry Smith @*/ 16918c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray(Mat A,PetscScalar **array) 169273a71a0fSBarry Smith { 169373a71a0fSBarry Smith PetscErrorCode ierr; 169473a71a0fSBarry Smith 169573a71a0fSBarry Smith PetscFunctionBegin; 16968c778c55SBarry Smith ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr); 169773a71a0fSBarry Smith PetscFunctionReturn(0); 169873a71a0fSBarry Smith } 169973a71a0fSBarry Smith 170073a71a0fSBarry Smith #undef __FUNCT__ 17014a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 170213f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 17030754003eSLois Curfman McInnes { 1704c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 17056849ba73SBarry Smith PetscErrorCode ierr; 17065d0c19d7SBarry Smith PetscInt i,j,nrows,ncols; 17075d0c19d7SBarry Smith const PetscInt *irow,*icol; 170887828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 17090754003eSLois Curfman McInnes Mat newmat; 17100754003eSLois Curfman McInnes 17113a40ed3dSBarry Smith PetscFunctionBegin; 171278b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 171378b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1714e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1715e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 17160754003eSLois Curfman McInnes 1717182d2002SSatish Balay /* Check submatrixcall */ 1718182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 171913f74950SBarry Smith PetscInt n_cols,n_rows; 1720182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 172121a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 1722f746d493SDmitry Karpeev /* resize the result matrix to match number of requested rows/columns */ 1723c61587bbSBarry Smith ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 172421a2c019SBarry Smith } 1725182d2002SSatish Balay newmat = *B; 1726182d2002SSatish Balay } else { 17270754003eSLois Curfman McInnes /* Create and fill new matrix */ 1728ce94432eSBarry Smith ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr); 1729f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 17307adad957SLisandro Dalcin ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr); 17310298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr); 1732182d2002SSatish Balay } 1733182d2002SSatish Balay 1734182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1735182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1736182d2002SSatish Balay 1737182d2002SSatish Balay for (i=0; i<ncols; i++) { 17386de62eeeSBarry Smith av = v + mat->lda*icol[i]; 17392205254eSKarl Rupp for (j=0; j<nrows; j++) *bv++ = av[irow[j]]; 17400754003eSLois Curfman McInnes } 1741182d2002SSatish Balay 1742182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 17436d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 17446d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 17450754003eSLois Curfman McInnes 17460754003eSLois Curfman McInnes /* Free work space */ 174778b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 174878b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1749182d2002SSatish Balay *B = newmat; 17503a40ed3dSBarry Smith PetscFunctionReturn(0); 17510754003eSLois Curfman McInnes } 17520754003eSLois Curfman McInnes 17534a2ae208SSatish Balay #undef __FUNCT__ 17544a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 1755e0877f53SBarry Smith static PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1756905e6a2fSBarry Smith { 17576849ba73SBarry Smith PetscErrorCode ierr; 175813f74950SBarry Smith PetscInt i; 1759905e6a2fSBarry Smith 17603a40ed3dSBarry Smith PetscFunctionBegin; 1761905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1762854ce69bSBarry Smith ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr); 1763905e6a2fSBarry Smith } 1764905e6a2fSBarry Smith 1765905e6a2fSBarry Smith for (i=0; i<n; i++) { 17666a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1767905e6a2fSBarry Smith } 17683a40ed3dSBarry Smith PetscFunctionReturn(0); 1769905e6a2fSBarry Smith } 1770905e6a2fSBarry Smith 17714a2ae208SSatish Balay #undef __FUNCT__ 1772c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1773e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1774c0aa2d19SHong Zhang { 1775c0aa2d19SHong Zhang PetscFunctionBegin; 1776c0aa2d19SHong Zhang PetscFunctionReturn(0); 1777c0aa2d19SHong Zhang } 1778c0aa2d19SHong Zhang 1779c0aa2d19SHong Zhang #undef __FUNCT__ 1780c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1781e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1782c0aa2d19SHong Zhang { 1783c0aa2d19SHong Zhang PetscFunctionBegin; 1784c0aa2d19SHong Zhang PetscFunctionReturn(0); 1785c0aa2d19SHong Zhang } 1786c0aa2d19SHong Zhang 1787c0aa2d19SHong Zhang #undef __FUNCT__ 17884a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1789e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 17904b0e389bSBarry Smith { 17914b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data; 17926849ba73SBarry Smith PetscErrorCode ierr; 1793d0f46423SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j; 17943a40ed3dSBarry Smith 17953a40ed3dSBarry Smith PetscFunctionBegin; 179633f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 179733f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1798cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 17993a40ed3dSBarry Smith PetscFunctionReturn(0); 18003a40ed3dSBarry Smith } 1801e32f2f54SBarry Smith if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1802a5ce6ee0Svictorle if (lda1>m || lda2>m) { 18030dbb7854Svictorle for (j=0; j<n; j++) { 1804a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1805a5ce6ee0Svictorle } 1806a5ce6ee0Svictorle } else { 1807d0f46423SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 1808a5ce6ee0Svictorle } 1809273d9f13SBarry Smith PetscFunctionReturn(0); 1810273d9f13SBarry Smith } 1811273d9f13SBarry Smith 18124a2ae208SSatish Balay #undef __FUNCT__ 18134994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense" 1814e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A) 1815273d9f13SBarry Smith { 1816dfbe8321SBarry Smith PetscErrorCode ierr; 1817273d9f13SBarry Smith 1818273d9f13SBarry Smith PetscFunctionBegin; 1819273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 18203a40ed3dSBarry Smith PetscFunctionReturn(0); 18214b0e389bSBarry Smith } 18224b0e389bSBarry Smith 1823284134d9SBarry Smith #undef __FUNCT__ 1824ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense" 1825ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A) 1826ba337c44SJed Brown { 1827ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1828ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1829ba337c44SJed Brown PetscScalar *aa = a->v; 1830ba337c44SJed Brown 1831ba337c44SJed Brown PetscFunctionBegin; 1832ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]); 1833ba337c44SJed Brown PetscFunctionReturn(0); 1834ba337c44SJed Brown } 1835ba337c44SJed Brown 1836ba337c44SJed Brown #undef __FUNCT__ 1837ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense" 1838ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A) 1839ba337c44SJed Brown { 1840ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1841ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1842ba337c44SJed Brown PetscScalar *aa = a->v; 1843ba337c44SJed Brown 1844ba337c44SJed Brown PetscFunctionBegin; 1845ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]); 1846ba337c44SJed Brown PetscFunctionReturn(0); 1847ba337c44SJed Brown } 1848ba337c44SJed Brown 1849ba337c44SJed Brown #undef __FUNCT__ 1850ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense" 1851ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A) 1852ba337c44SJed Brown { 1853ba337c44SJed Brown Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1854ba337c44SJed Brown PetscInt i,nz = A->rmap->n*A->cmap->n; 1855ba337c44SJed Brown PetscScalar *aa = a->v; 1856ba337c44SJed Brown 1857ba337c44SJed Brown PetscFunctionBegin; 1858ba337c44SJed Brown for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]); 1859ba337c44SJed Brown PetscFunctionReturn(0); 1860ba337c44SJed Brown } 1861284134d9SBarry Smith 1862a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1863a9fe9ddaSSatish Balay #undef __FUNCT__ 1864a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1865150d2497SBarry Smith PETSC_INTERN PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1866a9fe9ddaSSatish Balay { 1867a9fe9ddaSSatish Balay PetscErrorCode ierr; 1868a9fe9ddaSSatish Balay 1869a9fe9ddaSSatish Balay PetscFunctionBegin; 1870a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 18713ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1872a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 18733ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1874a9fe9ddaSSatish Balay } 18753ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1876a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 18773ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1878a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1879a9fe9ddaSSatish Balay } 1880a9fe9ddaSSatish Balay 1881a9fe9ddaSSatish Balay #undef __FUNCT__ 1882a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1883a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1884a9fe9ddaSSatish Balay { 1885ee16a9a1SHong Zhang PetscErrorCode ierr; 1886d0f46423SBarry Smith PetscInt m=A->rmap->n,n=B->cmap->n; 1887ee16a9a1SHong Zhang Mat Cmat; 1888a9fe9ddaSSatish Balay 1889ee16a9a1SHong Zhang PetscFunctionBegin; 1890e32f2f54SBarry 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); 1891ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1892ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1893ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 18940298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 1895d73949e8SHong Zhang 1896ee16a9a1SHong Zhang *C = Cmat; 1897ee16a9a1SHong Zhang PetscFunctionReturn(0); 1898ee16a9a1SHong Zhang } 1899a9fe9ddaSSatish Balay 190098a3b096SSatish Balay #undef __FUNCT__ 1901a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1902a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1903a9fe9ddaSSatish Balay { 1904a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1905a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1906a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 19070805154bSBarry Smith PetscBLASInt m,n,k; 1908a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1909c5df96a5SBarry Smith PetscErrorCode ierr; 1910fd4e9aacSBarry Smith PetscBool flg; 1911a9fe9ddaSSatish Balay 1912a9fe9ddaSSatish Balay PetscFunctionBegin; 1913fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr); 1914fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense"); 1915fd4e9aacSBarry Smith 1916fd4e9aacSBarry Smith /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/ 1917fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr); 1918fd4e9aacSBarry Smith if (flg) { 1919fd4e9aacSBarry Smith C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense; 1920fd4e9aacSBarry Smith ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr); 1921fd4e9aacSBarry Smith PetscFunctionReturn(0); 1922fd4e9aacSBarry Smith } 1923fd4e9aacSBarry Smith 1924fd4e9aacSBarry Smith ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr); 1925fd4e9aacSBarry Smith if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense"); 1926c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr); 1927c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1928c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr); 19295ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1930a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1931a9fe9ddaSSatish Balay } 1932a9fe9ddaSSatish Balay 1933a9fe9ddaSSatish Balay #undef __FUNCT__ 193475648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense" 193575648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1936a9fe9ddaSSatish Balay { 1937a9fe9ddaSSatish Balay PetscErrorCode ierr; 1938a9fe9ddaSSatish Balay 1939a9fe9ddaSSatish Balay PetscFunctionBegin; 1940a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX) { 19413ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 194275648e8dSHong Zhang ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 19433ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr); 1944a9fe9ddaSSatish Balay } 19453ff4c91cSHong Zhang ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 194675648e8dSHong Zhang ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 19473ff4c91cSHong Zhang ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr); 1948a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1949a9fe9ddaSSatish Balay } 1950a9fe9ddaSSatish Balay 1951a9fe9ddaSSatish Balay #undef __FUNCT__ 195275648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense" 195375648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1954a9fe9ddaSSatish Balay { 1955ee16a9a1SHong Zhang PetscErrorCode ierr; 1956d0f46423SBarry Smith PetscInt m=A->cmap->n,n=B->cmap->n; 1957ee16a9a1SHong Zhang Mat Cmat; 1958a9fe9ddaSSatish Balay 1959ee16a9a1SHong Zhang PetscFunctionBegin; 1960e32f2f54SBarry 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); 1961ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1962ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1963ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 19640298fd71SBarry Smith ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr); 19652205254eSKarl Rupp 1966ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 19672205254eSKarl Rupp 1968ee16a9a1SHong Zhang *C = Cmat; 1969ee16a9a1SHong Zhang PetscFunctionReturn(0); 1970ee16a9a1SHong Zhang } 1971a9fe9ddaSSatish Balay 1972a9fe9ddaSSatish Balay #undef __FUNCT__ 197375648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense" 197475648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1975a9fe9ddaSSatish Balay { 1976a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1977a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1978a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 19790805154bSBarry Smith PetscBLASInt m,n,k; 1980a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1981c5df96a5SBarry Smith PetscErrorCode ierr; 1982a9fe9ddaSSatish Balay 1983a9fe9ddaSSatish Balay PetscFunctionBegin; 1984c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr); 1985c5df96a5SBarry Smith ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr); 1986c5df96a5SBarry Smith ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr); 19872fbe02b9SBarry Smith /* 19882fbe02b9SBarry Smith Note the m and n arguments below are the number rows and columns of A', not A! 19892fbe02b9SBarry Smith */ 19905ca1cc5dSStefano Zampini PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda)); 1991a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1992a9fe9ddaSSatish Balay } 1993985db425SBarry Smith 1994985db425SBarry Smith #undef __FUNCT__ 1995985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 1996e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1997985db425SBarry Smith { 1998985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1999985db425SBarry Smith PetscErrorCode ierr; 2000d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2001985db425SBarry Smith PetscScalar *x; 2002985db425SBarry Smith MatScalar *aa = a->v; 2003985db425SBarry Smith 2004985db425SBarry Smith PetscFunctionBegin; 2005e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2006985db425SBarry Smith 2007985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2008985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2009985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2010e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2011985db425SBarry Smith for (i=0; i<m; i++) { 2012985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2013985db425SBarry Smith for (j=1; j<n; j++) { 2014985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 2015985db425SBarry Smith } 2016985db425SBarry Smith } 2017985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2018985db425SBarry Smith PetscFunctionReturn(0); 2019985db425SBarry Smith } 2020985db425SBarry Smith 2021985db425SBarry Smith #undef __FUNCT__ 2022985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 2023e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 2024985db425SBarry Smith { 2025985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2026985db425SBarry Smith PetscErrorCode ierr; 2027d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2028985db425SBarry Smith PetscScalar *x; 2029985db425SBarry Smith PetscReal atmp; 2030985db425SBarry Smith MatScalar *aa = a->v; 2031985db425SBarry Smith 2032985db425SBarry Smith PetscFunctionBegin; 2033e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2034985db425SBarry Smith 2035985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2036985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2037985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2038e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2039985db425SBarry Smith for (i=0; i<m; i++) { 20409189402eSHong Zhang x[i] = PetscAbsScalar(aa[i]); 2041985db425SBarry Smith for (j=1; j<n; j++) { 2042985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 2043985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 2044985db425SBarry Smith } 2045985db425SBarry Smith } 2046985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2047985db425SBarry Smith PetscFunctionReturn(0); 2048985db425SBarry Smith } 2049985db425SBarry Smith 2050985db425SBarry Smith #undef __FUNCT__ 2051985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 2052e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 2053985db425SBarry Smith { 2054985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 2055985db425SBarry Smith PetscErrorCode ierr; 2056d0f46423SBarry Smith PetscInt i,j,m = A->rmap->n,n = A->cmap->n,p; 2057985db425SBarry Smith PetscScalar *x; 2058985db425SBarry Smith MatScalar *aa = a->v; 2059985db425SBarry Smith 2060985db425SBarry Smith PetscFunctionBegin; 2061e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 2062985db425SBarry Smith 2063985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 2064985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2065985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 2066e32f2f54SBarry Smith if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 2067985db425SBarry Smith for (i=0; i<m; i++) { 2068985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 2069985db425SBarry Smith for (j=1; j<n; j++) { 2070985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 2071985db425SBarry Smith } 2072985db425SBarry Smith } 2073985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 2074985db425SBarry Smith PetscFunctionReturn(0); 2075985db425SBarry Smith } 2076985db425SBarry Smith 20778d0534beSBarry Smith #undef __FUNCT__ 20788d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 2079e0877f53SBarry Smith static PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 20808d0534beSBarry Smith { 20818d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 20828d0534beSBarry Smith PetscErrorCode ierr; 20838d0534beSBarry Smith PetscScalar *x; 20848d0534beSBarry Smith 20858d0534beSBarry Smith PetscFunctionBegin; 2086e32f2f54SBarry Smith if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 20878d0534beSBarry Smith 20888d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 2089d0f46423SBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr); 20908d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 20918d0534beSBarry Smith PetscFunctionReturn(0); 20928d0534beSBarry Smith } 20938d0534beSBarry Smith 20940716a85fSBarry Smith 20950716a85fSBarry Smith #undef __FUNCT__ 20960716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense" 20970716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms) 20980716a85fSBarry Smith { 20990716a85fSBarry Smith PetscErrorCode ierr; 21000716a85fSBarry Smith PetscInt i,j,m,n; 21010716a85fSBarry Smith PetscScalar *a; 21020716a85fSBarry Smith 21030716a85fSBarry Smith PetscFunctionBegin; 21040716a85fSBarry Smith ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr); 21050716a85fSBarry Smith ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr); 21068c778c55SBarry Smith ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr); 21070716a85fSBarry Smith if (type == NORM_2) { 21080716a85fSBarry Smith for (i=0; i<n; i++) { 21090716a85fSBarry Smith for (j=0; j<m; j++) { 21100716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]*a[j]); 21110716a85fSBarry Smith } 21120716a85fSBarry Smith a += m; 21130716a85fSBarry Smith } 21140716a85fSBarry Smith } else if (type == NORM_1) { 21150716a85fSBarry Smith for (i=0; i<n; i++) { 21160716a85fSBarry Smith for (j=0; j<m; j++) { 21170716a85fSBarry Smith norms[i] += PetscAbsScalar(a[j]); 21180716a85fSBarry Smith } 21190716a85fSBarry Smith a += m; 21200716a85fSBarry Smith } 21210716a85fSBarry Smith } else if (type == NORM_INFINITY) { 21220716a85fSBarry Smith for (i=0; i<n; i++) { 21230716a85fSBarry Smith for (j=0; j<m; j++) { 21240716a85fSBarry Smith norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]); 21250716a85fSBarry Smith } 21260716a85fSBarry Smith a += m; 21270716a85fSBarry Smith } 2128ce94432eSBarry Smith } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType"); 21298c778c55SBarry Smith ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr); 21300716a85fSBarry Smith if (type == NORM_2) { 21318f1a2a5eSBarry Smith for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]); 21320716a85fSBarry Smith } 21330716a85fSBarry Smith PetscFunctionReturn(0); 21340716a85fSBarry Smith } 21350716a85fSBarry Smith 213673a71a0fSBarry Smith #undef __FUNCT__ 213773a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense" 213873a71a0fSBarry Smith static PetscErrorCode MatSetRandom_SeqDense(Mat x,PetscRandom rctx) 213973a71a0fSBarry Smith { 214073a71a0fSBarry Smith PetscErrorCode ierr; 214173a71a0fSBarry Smith PetscScalar *a; 214273a71a0fSBarry Smith PetscInt m,n,i; 214373a71a0fSBarry Smith 214473a71a0fSBarry Smith PetscFunctionBegin; 214573a71a0fSBarry Smith ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr); 21468c778c55SBarry Smith ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr); 214773a71a0fSBarry Smith for (i=0; i<m*n; i++) { 214873a71a0fSBarry Smith ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr); 214973a71a0fSBarry Smith } 21508c778c55SBarry Smith ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr); 215173a71a0fSBarry Smith PetscFunctionReturn(0); 215273a71a0fSBarry Smith } 215373a71a0fSBarry Smith 21543b49f96aSBarry Smith #undef __FUNCT__ 21553b49f96aSBarry Smith #define __FUNCT__ "MatMissingDiagonal_SeqDense" 21563b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool *missing,PetscInt *d) 21573b49f96aSBarry Smith { 21583b49f96aSBarry Smith PetscFunctionBegin; 21593b49f96aSBarry Smith *missing = PETSC_FALSE; 21603b49f96aSBarry Smith PetscFunctionReturn(0); 21613b49f96aSBarry Smith } 216273a71a0fSBarry Smith 2163abc3b08eSStefano Zampini 2164289bc588SBarry Smith /* -------------------------------------------------------------------*/ 2165a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense, 2166905e6a2fSBarry Smith MatGetRow_SeqDense, 2167905e6a2fSBarry Smith MatRestoreRow_SeqDense, 2168905e6a2fSBarry Smith MatMult_SeqDense, 216997304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 21707c922b88SBarry Smith MatMultTranspose_SeqDense, 21717c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 2172db4efbfdSBarry Smith 0, 2173db4efbfdSBarry Smith 0, 2174db4efbfdSBarry Smith 0, 2175db4efbfdSBarry Smith /* 10*/ 0, 2176905e6a2fSBarry Smith MatLUFactor_SeqDense, 2177905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 217841f059aeSBarry Smith MatSOR_SeqDense, 2179ec8511deSBarry Smith MatTranspose_SeqDense, 218097304618SKris Buschelman /* 15*/ MatGetInfo_SeqDense, 2181905e6a2fSBarry Smith MatEqual_SeqDense, 2182905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 2183905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 2184905e6a2fSBarry Smith MatNorm_SeqDense, 2185c0aa2d19SHong Zhang /* 20*/ MatAssemblyBegin_SeqDense, 2186c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 2187905e6a2fSBarry Smith MatSetOption_SeqDense, 2188905e6a2fSBarry Smith MatZeroEntries_SeqDense, 2189d519adbfSMatthew Knepley /* 24*/ MatZeroRows_SeqDense, 2190db4efbfdSBarry Smith 0, 2191db4efbfdSBarry Smith 0, 2192db4efbfdSBarry Smith 0, 2193db4efbfdSBarry Smith 0, 21944994cf47SJed Brown /* 29*/ MatSetUp_SeqDense, 2195273d9f13SBarry Smith 0, 2196905e6a2fSBarry Smith 0, 219773a71a0fSBarry Smith 0, 219873a71a0fSBarry Smith 0, 2199d519adbfSMatthew Knepley /* 34*/ MatDuplicate_SeqDense, 2200a5ae1ecdSBarry Smith 0, 2201a5ae1ecdSBarry Smith 0, 2202a5ae1ecdSBarry Smith 0, 2203a5ae1ecdSBarry Smith 0, 2204d519adbfSMatthew Knepley /* 39*/ MatAXPY_SeqDense, 2205a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 2206a5ae1ecdSBarry Smith 0, 22074b0e389bSBarry Smith MatGetValues_SeqDense, 2208a5ae1ecdSBarry Smith MatCopy_SeqDense, 2209d519adbfSMatthew Knepley /* 44*/ MatGetRowMax_SeqDense, 2210a5ae1ecdSBarry Smith MatScale_SeqDense, 22117d68702bSBarry Smith MatShift_Basic, 2212a5ae1ecdSBarry Smith 0, 22133f49a652SStefano Zampini MatZeroRowsColumns_SeqDense, 221473a71a0fSBarry Smith /* 49*/ MatSetRandom_SeqDense, 2215a5ae1ecdSBarry Smith 0, 2216a5ae1ecdSBarry Smith 0, 2217a5ae1ecdSBarry Smith 0, 2218a5ae1ecdSBarry Smith 0, 2219d519adbfSMatthew Knepley /* 54*/ 0, 2220a5ae1ecdSBarry Smith 0, 2221a5ae1ecdSBarry Smith 0, 2222a5ae1ecdSBarry Smith 0, 2223a5ae1ecdSBarry Smith 0, 2224d519adbfSMatthew Knepley /* 59*/ 0, 2225e03a110bSBarry Smith MatDestroy_SeqDense, 2226e03a110bSBarry Smith MatView_SeqDense, 2227357abbc8SBarry Smith 0, 222897304618SKris Buschelman 0, 2229d519adbfSMatthew Knepley /* 64*/ 0, 223097304618SKris Buschelman 0, 223197304618SKris Buschelman 0, 223297304618SKris Buschelman 0, 223397304618SKris Buschelman 0, 2234d519adbfSMatthew Knepley /* 69*/ MatGetRowMaxAbs_SeqDense, 223597304618SKris Buschelman 0, 223697304618SKris Buschelman 0, 223797304618SKris Buschelman 0, 223897304618SKris Buschelman 0, 2239d519adbfSMatthew Knepley /* 74*/ 0, 224097304618SKris Buschelman 0, 224197304618SKris Buschelman 0, 224297304618SKris Buschelman 0, 224397304618SKris Buschelman 0, 2244d519adbfSMatthew Knepley /* 79*/ 0, 224597304618SKris Buschelman 0, 224697304618SKris Buschelman 0, 224797304618SKris Buschelman 0, 22485bba2384SShri Abhyankar /* 83*/ MatLoad_SeqDense, 2249865e5f61SKris Buschelman 0, 22501cbb95d3SBarry Smith MatIsHermitian_SeqDense, 2251865e5f61SKris Buschelman 0, 2252865e5f61SKris Buschelman 0, 2253865e5f61SKris Buschelman 0, 2254d519adbfSMatthew Knepley /* 89*/ MatMatMult_SeqDense_SeqDense, 2255a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 2256a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 2257abc3b08eSStefano Zampini MatPtAP_SeqDense_SeqDense, 2258abc3b08eSStefano Zampini MatPtAPSymbolic_SeqDense_SeqDense, 2259abc3b08eSStefano Zampini /* 94*/ MatPtAPNumeric_SeqDense_SeqDense, 22605df89d91SHong Zhang 0, 22615df89d91SHong Zhang 0, 22625df89d91SHong Zhang 0, 2263284134d9SBarry Smith 0, 2264d519adbfSMatthew Knepley /* 99*/ 0, 2265284134d9SBarry Smith 0, 2266284134d9SBarry Smith 0, 2267ba337c44SJed Brown MatConjugate_SeqDense, 2268f73d5cc4SBarry Smith 0, 2269ba337c44SJed Brown /*104*/ 0, 2270ba337c44SJed Brown MatRealPart_SeqDense, 2271ba337c44SJed Brown MatImaginaryPart_SeqDense, 2272985db425SBarry Smith 0, 2273985db425SBarry Smith 0, 227485e2c93fSHong Zhang /*109*/ MatMatSolve_SeqDense, 2275985db425SBarry Smith 0, 22768d0534beSBarry Smith MatGetRowMin_SeqDense, 2277aabbc4fbSShri Abhyankar MatGetColumnVector_SeqDense, 22783b49f96aSBarry Smith MatMissingDiagonal_SeqDense, 2279aabbc4fbSShri Abhyankar /*114*/ 0, 2280aabbc4fbSShri Abhyankar 0, 2281aabbc4fbSShri Abhyankar 0, 2282aabbc4fbSShri Abhyankar 0, 2283aabbc4fbSShri Abhyankar 0, 2284aabbc4fbSShri Abhyankar /*119*/ 0, 2285aabbc4fbSShri Abhyankar 0, 2286aabbc4fbSShri Abhyankar 0, 22870716a85fSBarry Smith 0, 22880716a85fSBarry Smith 0, 22890716a85fSBarry Smith /*124*/ 0, 22905df89d91SHong Zhang MatGetColumnNorms_SeqDense, 22915df89d91SHong Zhang 0, 22925df89d91SHong Zhang 0, 22935df89d91SHong Zhang 0, 22945df89d91SHong Zhang /*129*/ 0, 229575648e8dSHong Zhang MatTransposeMatMult_SeqDense_SeqDense, 229675648e8dSHong Zhang MatTransposeMatMultSymbolic_SeqDense_SeqDense, 229775648e8dSHong Zhang MatTransposeMatMultNumeric_SeqDense_SeqDense, 22983964eb88SJed Brown 0, 22993964eb88SJed Brown /*134*/ 0, 23003964eb88SJed Brown 0, 23013964eb88SJed Brown 0, 23023964eb88SJed Brown 0, 23033964eb88SJed Brown 0, 23043964eb88SJed Brown /*139*/ 0, 2305f9426fe0SMark Adams 0, 23063964eb88SJed Brown 0 2307985db425SBarry Smith }; 230890ace30eSBarry Smith 23094a2ae208SSatish Balay #undef __FUNCT__ 23104a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 23114b828684SBarry Smith /*@C 2312fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 2313d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 2314d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 2315289bc588SBarry Smith 2316db81eaa0SLois Curfman McInnes Collective on MPI_Comm 2317db81eaa0SLois Curfman McInnes 231820563c6bSBarry Smith Input Parameters: 2319db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 23200c775827SLois Curfman McInnes . m - number of rows 232118f449edSLois Curfman McInnes . n - number of columns 23220298fd71SBarry Smith - data - optional location of matrix data in column major order. Set data=NULL for PETSc 2323dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 232420563c6bSBarry Smith 232520563c6bSBarry Smith Output Parameter: 232644cd7ae7SLois Curfman McInnes . A - the matrix 232720563c6bSBarry Smith 2328b259b22eSLois Curfman McInnes Notes: 232918f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 233018f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 23310298fd71SBarry Smith set data=NULL. 233218f449edSLois Curfman McInnes 2333027ccd11SLois Curfman McInnes Level: intermediate 2334027ccd11SLois Curfman McInnes 2335dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 2336d65003e9SLois Curfman McInnes 233769b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues() 233820563c6bSBarry Smith @*/ 23397087cfbeSBarry Smith PetscErrorCode MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 2340289bc588SBarry Smith { 2341dfbe8321SBarry Smith PetscErrorCode ierr; 23423b2fbd54SBarry Smith 23433a40ed3dSBarry Smith PetscFunctionBegin; 2344f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 2345f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 2346273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 2347273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 2348273d9f13SBarry Smith PetscFunctionReturn(0); 2349273d9f13SBarry Smith } 2350273d9f13SBarry Smith 23514a2ae208SSatish Balay #undef __FUNCT__ 2352afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 2353273d9f13SBarry Smith /*@C 2354273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 2355273d9f13SBarry Smith 2356273d9f13SBarry Smith Collective on MPI_Comm 2357273d9f13SBarry Smith 2358273d9f13SBarry Smith Input Parameters: 23591c4f3114SJed Brown + B - the matrix 23600298fd71SBarry Smith - data - the array (or NULL) 2361273d9f13SBarry Smith 2362273d9f13SBarry Smith Notes: 2363273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 2364273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 2365284134d9SBarry Smith need not call this routine. 2366273d9f13SBarry Smith 2367273d9f13SBarry Smith Level: intermediate 2368273d9f13SBarry Smith 2369273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 2370273d9f13SBarry Smith 237169b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA() 2372867c911aSBarry Smith 2373273d9f13SBarry Smith @*/ 23747087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 2375273d9f13SBarry Smith { 23764ac538c5SBarry Smith PetscErrorCode ierr; 2377a23d5eceSKris Buschelman 2378a23d5eceSKris Buschelman PetscFunctionBegin; 23794ac538c5SBarry Smith ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr); 2380a23d5eceSKris Buschelman PetscFunctionReturn(0); 2381a23d5eceSKris Buschelman } 2382a23d5eceSKris Buschelman 2383a23d5eceSKris Buschelman #undef __FUNCT__ 2384afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 23857087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 2386a23d5eceSKris Buschelman { 2387273d9f13SBarry Smith Mat_SeqDense *b; 2388dfbe8321SBarry Smith PetscErrorCode ierr; 2389273d9f13SBarry Smith 2390273d9f13SBarry Smith PetscFunctionBegin; 2391273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 2392a868139aSShri Abhyankar 239334ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr); 239434ef9618SShri Abhyankar ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr); 239534ef9618SShri Abhyankar 2396273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 239786d161a7SShri Abhyankar b->Mmax = B->rmap->n; 239886d161a7SShri Abhyankar b->Nmax = B->cmap->n; 239986d161a7SShri Abhyankar if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n; 240086d161a7SShri Abhyankar 24019e8f95c4SLisandro Dalcin if (!data) { /* petsc-allocated storage */ 24029e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2403e92229d0SSatish Balay ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr); 24043bb1ff40SBarry Smith ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 24052205254eSKarl Rupp 24069e8f95c4SLisandro Dalcin b->user_alloc = PETSC_FALSE; 2407273d9f13SBarry Smith } else { /* user-allocated storage */ 24089e8f95c4SLisandro Dalcin if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); } 2409273d9f13SBarry Smith b->v = data; 2410273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 2411273d9f13SBarry Smith } 24120450473dSBarry Smith B->assembled = PETSC_TRUE; 2413273d9f13SBarry Smith PetscFunctionReturn(0); 2414273d9f13SBarry Smith } 2415273d9f13SBarry Smith 241665b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 24171b807ce4Svictorle #undef __FUNCT__ 24188baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental" 2419cc2e6a90SBarry Smith PETSC_INTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat) 24208baccfbdSHong Zhang { 2421d77f618aSHong Zhang Mat mat_elemental; 2422d77f618aSHong Zhang PetscErrorCode ierr; 2423d77f618aSHong Zhang PetscScalar *array,*v_colwise; 2424d77f618aSHong Zhang PetscInt M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols; 2425d77f618aSHong Zhang 24268baccfbdSHong Zhang PetscFunctionBegin; 2427d77f618aSHong Zhang ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr); 2428d77f618aSHong Zhang ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr); 2429d77f618aSHong Zhang /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */ 2430d77f618aSHong Zhang k = 0; 2431d77f618aSHong Zhang for (j=0; j<N; j++) { 2432d77f618aSHong Zhang cols[j] = j; 2433d77f618aSHong Zhang for (i=0; i<M; i++) { 2434d77f618aSHong Zhang v_colwise[j*M+i] = array[k++]; 2435d77f618aSHong Zhang } 2436d77f618aSHong Zhang } 2437d77f618aSHong Zhang for (i=0; i<M; i++) { 2438d77f618aSHong Zhang rows[i] = i; 2439d77f618aSHong Zhang } 2440d77f618aSHong Zhang ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr); 2441d77f618aSHong Zhang 2442d77f618aSHong Zhang ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr); 2443d77f618aSHong Zhang ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr); 2444d77f618aSHong Zhang ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr); 2445d77f618aSHong Zhang ierr = MatSetUp(mat_elemental);CHKERRQ(ierr); 2446d77f618aSHong Zhang 2447d77f618aSHong Zhang /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */ 2448d77f618aSHong Zhang ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr); 2449d77f618aSHong Zhang ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2450d77f618aSHong Zhang ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 2451d77f618aSHong Zhang ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr); 2452d77f618aSHong Zhang 2453511c6705SHong Zhang if (reuse == MAT_INPLACE_MATRIX) { 245428be2f97SBarry Smith ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr); 2455d77f618aSHong Zhang } else { 2456d77f618aSHong Zhang *newmat = mat_elemental; 2457d77f618aSHong Zhang } 24588baccfbdSHong Zhang PetscFunctionReturn(0); 24598baccfbdSHong Zhang } 246065b80a83SHong Zhang #endif 24618baccfbdSHong Zhang 24628baccfbdSHong Zhang #undef __FUNCT__ 24631b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 24641b807ce4Svictorle /*@C 24651b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 24661b807ce4Svictorle 24671b807ce4Svictorle Input parameter: 24681b807ce4Svictorle + A - the matrix 24691b807ce4Svictorle - lda - the leading dimension 24701b807ce4Svictorle 24711b807ce4Svictorle Notes: 2472867c911aSBarry Smith This routine is to be used in conjunction with MatSeqDenseSetPreallocation(); 24731b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 24741b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 24751b807ce4Svictorle 24761b807ce4Svictorle Level: intermediate 24771b807ce4Svictorle 24781b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 24791b807ce4Svictorle 2480284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 2481867c911aSBarry Smith 24821b807ce4Svictorle @*/ 24837087cfbeSBarry Smith PetscErrorCode MatSeqDenseSetLDA(Mat B,PetscInt lda) 24841b807ce4Svictorle { 24851b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 248621a2c019SBarry Smith 24871b807ce4Svictorle PetscFunctionBegin; 2488e32f2f54SBarry 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); 24891b807ce4Svictorle b->lda = lda; 249021a2c019SBarry Smith b->changelda = PETSC_FALSE; 249121a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 24921b807ce4Svictorle PetscFunctionReturn(0); 24931b807ce4Svictorle } 24941b807ce4Svictorle 24950bad9183SKris Buschelman /*MC 2496fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 24970bad9183SKris Buschelman 24980bad9183SKris Buschelman Options Database Keys: 24990bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 25000bad9183SKris Buschelman 25010bad9183SKris Buschelman Level: beginner 25020bad9183SKris Buschelman 250389665df3SBarry Smith .seealso: MatCreateSeqDense() 250489665df3SBarry Smith 25050bad9183SKris Buschelman M*/ 25060bad9183SKris Buschelman 25074a2ae208SSatish Balay #undef __FUNCT__ 25084a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 25098cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B) 2510273d9f13SBarry Smith { 2511273d9f13SBarry Smith Mat_SeqDense *b; 2512dfbe8321SBarry Smith PetscErrorCode ierr; 25137c334f02SBarry Smith PetscMPIInt size; 2514273d9f13SBarry Smith 2515273d9f13SBarry Smith PetscFunctionBegin; 2516ce94432eSBarry Smith ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr); 2517e32f2f54SBarry Smith if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 251855659b69SBarry Smith 2519b00a9115SJed Brown ierr = PetscNewLog(B,&b);CHKERRQ(ierr); 2520549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 252144cd7ae7SLois Curfman McInnes B->data = (void*)b; 252218f449edSLois Curfman McInnes 252344cd7ae7SLois Curfman McInnes b->pivots = 0; 2524273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 2525273d9f13SBarry Smith b->v = 0; 252621a2c019SBarry Smith b->changelda = PETSC_FALSE; 25274e220ebcSLois Curfman McInnes 2528bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr); 2529bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr); 2530bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr); 25318baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL) 25328baccfbdSHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr); 25338baccfbdSHong Zhang #endif 2534bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 2535bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 2536bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 2537bdf89e91SBarry Smith ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 2538abc3b08eSStefano Zampini ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr); 25393bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 25403bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 25413bf78175SHong Zhang ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 254217667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 25433a40ed3dSBarry Smith PetscFunctionReturn(0); 2544289bc588SBarry Smith } 2545