1be1d678aSKris Buschelman #define PETSCMAT_DLL 2be1d678aSKris Buschelman 367e560aaSBarry Smith /* 467e560aaSBarry Smith Defines the basic matrix operations for sequential dense. 567e560aaSBarry Smith */ 6289bc588SBarry Smith 770f55243SBarry Smith #include "src/mat/impls/dense/seq/dense.h" 8b4c862e0SSatish Balay #include "petscblaslapack.h" 9289bc588SBarry Smith 104a2ae208SSatish Balay #undef __FUNCT__ 114a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense" 12f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str) 131987afe7SBarry Smith { 141987afe7SBarry Smith Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data; 15f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 1613f74950SBarry Smith PetscInt j; 17899cda47SBarry Smith PetscBLASInt N = (PetscBLASInt)X->rmap.n*X->cmap.n,m=(PetscBLASInt)X->rmap.n,ldax = x->lda,lday=y->lda,one = 1; 18efee365bSSatish Balay PetscErrorCode ierr; 193a40ed3dSBarry Smith 203a40ed3dSBarry Smith PetscFunctionBegin; 21a5ce6ee0Svictorle if (ldax>m || lday>m) { 22899cda47SBarry Smith for (j=0; j<X->cmap.n; j++) { 23f4df32b1SMatthew Knepley BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one); 24a5ce6ee0Svictorle } 25a5ce6ee0Svictorle } else { 26f4df32b1SMatthew Knepley BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one); 27a5ce6ee0Svictorle } 28efee365bSSatish Balay ierr = PetscLogFlops(2*N-1);CHKERRQ(ierr); 293a40ed3dSBarry Smith PetscFunctionReturn(0); 301987afe7SBarry Smith } 311987afe7SBarry Smith 324a2ae208SSatish Balay #undef __FUNCT__ 334a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense" 34dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 35289bc588SBarry Smith { 36899cda47SBarry Smith PetscInt N = A->rmap.n*A->cmap.n; 373a40ed3dSBarry Smith 383a40ed3dSBarry Smith PetscFunctionBegin; 39899cda47SBarry Smith info->rows_global = (double)A->rmap.n; 40899cda47SBarry Smith info->columns_global = (double)A->cmap.n; 41899cda47SBarry Smith info->rows_local = (double)A->rmap.n; 42899cda47SBarry Smith info->columns_local = (double)A->cmap.n; 434e220ebcSLois Curfman McInnes info->block_size = 1.0; 444e220ebcSLois Curfman McInnes info->nz_allocated = (double)N; 456de62eeeSBarry Smith info->nz_used = (double)N; 466de62eeeSBarry Smith info->nz_unneeded = (double)0; 474e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 484e220ebcSLois Curfman McInnes info->mallocs = 0; 494e220ebcSLois Curfman McInnes info->memory = A->mem; 504e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 514e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 524e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 533a40ed3dSBarry Smith PetscFunctionReturn(0); 54289bc588SBarry Smith } 55289bc588SBarry Smith 564a2ae208SSatish Balay #undef __FUNCT__ 574a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense" 58f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 5980cd9d93SLois Curfman McInnes { 60273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 61f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 624ce68768SBarry Smith PetscBLASInt one = 1,lda = a->lda,j,nz; 63efee365bSSatish Balay PetscErrorCode ierr; 6480cd9d93SLois Curfman McInnes 653a40ed3dSBarry Smith PetscFunctionBegin; 66899cda47SBarry Smith if (lda>A->rmap.n) { 67899cda47SBarry Smith nz = (PetscBLASInt)A->rmap.n; 68899cda47SBarry Smith for (j=0; j<A->cmap.n; j++) { 69f4df32b1SMatthew Knepley BLASscal_(&nz,&oalpha,a->v+j*lda,&one); 70a5ce6ee0Svictorle } 71a5ce6ee0Svictorle } else { 72899cda47SBarry Smith nz = (PetscBLASInt)A->rmap.n*A->cmap.n; 73f4df32b1SMatthew Knepley BLASscal_(&nz,&oalpha,a->v,&one); 74a5ce6ee0Svictorle } 75efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 763a40ed3dSBarry Smith PetscFunctionReturn(0); 7780cd9d93SLois Curfman McInnes } 7880cd9d93SLois Curfman McInnes 791cbb95d3SBarry Smith #undef __FUNCT__ 801cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense" 811cbb95d3SBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscTruth *fl) 821cbb95d3SBarry Smith { 831cbb95d3SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 841cbb95d3SBarry Smith PetscInt i,j,m = A->rmap.n,N; 851cbb95d3SBarry Smith PetscScalar *v = a->v; 861cbb95d3SBarry Smith 871cbb95d3SBarry Smith PetscFunctionBegin; 881cbb95d3SBarry Smith *fl = PETSC_FALSE; 891cbb95d3SBarry Smith if (A->rmap.n != A->cmap.n) PetscFunctionReturn(0); 901cbb95d3SBarry Smith N = a->lda; 911cbb95d3SBarry Smith 921cbb95d3SBarry Smith for (i=0; i<m; i++) { 931cbb95d3SBarry Smith for (j=i+1; j<m; j++) { 941cbb95d3SBarry Smith if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0); 951cbb95d3SBarry Smith } 961cbb95d3SBarry Smith } 971cbb95d3SBarry Smith *fl = PETSC_TRUE; 981cbb95d3SBarry Smith PetscFunctionReturn(0); 991cbb95d3SBarry Smith } 1001cbb95d3SBarry Smith 101289bc588SBarry Smith /* ---------------------------------------------------------------*/ 1026831982aSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 1036831982aSBarry Smith rather than put it in the Mat->row slot.*/ 1044a2ae208SSatish Balay #undef __FUNCT__ 1054a2ae208SSatish Balay #define __FUNCT__ "MatLUFactor_SeqDense" 106dfbe8321SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,MatFactorInfo *minfo) 107289bc588SBarry Smith { 108a07ab388SBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 10981f479a6Svictorle PetscFunctionBegin; 110a07ab388SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 111a07ab388SBarry Smith #else 112c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1136849ba73SBarry Smith PetscErrorCode ierr; 114899cda47SBarry Smith PetscBLASInt n = (PetscBLASInt)A->cmap.n,m = (PetscBLASInt)A->rmap.n,info; 11555659b69SBarry Smith 1163a40ed3dSBarry Smith PetscFunctionBegin; 117289bc588SBarry Smith if (!mat->pivots) { 118899cda47SBarry Smith ierr = PetscMalloc((A->rmap.n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr); 119899cda47SBarry Smith ierr = PetscLogObjectMemory(A,A->rmap.n*sizeof(PetscBLASInt));CHKERRQ(ierr); 120289bc588SBarry Smith } 121f1af5d2fSBarry Smith A->factor = FACTOR_LU; 122899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 12371044d3cSBarry Smith LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info); 12429bbc08cSBarry Smith if (info<0) SETERRQ(PETSC_ERR_LIB,"Bad argument to LU factorization"); 12529bbc08cSBarry Smith if (info>0) SETERRQ(PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 126899cda47SBarry Smith ierr = PetscLogFlops((2*A->cmap.n*A->cmap.n*A->cmap.n)/3);CHKERRQ(ierr); 127a07ab388SBarry Smith #endif 1283a40ed3dSBarry Smith PetscFunctionReturn(0); 129289bc588SBarry Smith } 1306ee01492SSatish Balay 1314a2ae208SSatish Balay #undef __FUNCT__ 1324a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense" 133dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 13402cad45dSBarry Smith { 13502cad45dSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 1366849ba73SBarry Smith PetscErrorCode ierr; 13713f74950SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 13802cad45dSBarry Smith Mat newi; 13902cad45dSBarry Smith 1403a40ed3dSBarry Smith PetscFunctionBegin; 141f69a0ea3SMatthew Knepley ierr = MatCreate(A->comm,&newi);CHKERRQ(ierr); 142899cda47SBarry Smith ierr = MatSetSizes(newi,A->rmap.n,A->cmap.n,A->rmap.n,A->cmap.n);CHKERRQ(ierr); 1435c5985e7SKris Buschelman ierr = MatSetType(newi,A->type_name);CHKERRQ(ierr); 1445c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(newi,PETSC_NULL);CHKERRQ(ierr); 1455609ef8eSBarry Smith if (cpvalues == MAT_COPY_VALUES) { 146a5ce6ee0Svictorle l = (Mat_SeqDense*)newi->data; 147899cda47SBarry Smith if (lda>A->rmap.n) { 148899cda47SBarry Smith m = A->rmap.n; 149899cda47SBarry Smith for (j=0; j<A->cmap.n; j++) { 150a5ce6ee0Svictorle ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 151a5ce6ee0Svictorle } 152a5ce6ee0Svictorle } else { 153899cda47SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap.n*A->cmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 15402cad45dSBarry Smith } 155a5ce6ee0Svictorle } 15602cad45dSBarry Smith newi->assembled = PETSC_TRUE; 15702cad45dSBarry Smith *newmat = newi; 1583a40ed3dSBarry Smith PetscFunctionReturn(0); 15902cad45dSBarry Smith } 16002cad45dSBarry Smith 1614a2ae208SSatish Balay #undef __FUNCT__ 1624a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorSymbolic_SeqDense" 163dfbe8321SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat A,IS row,IS col,MatFactorInfo *info,Mat *fact) 164289bc588SBarry Smith { 165dfbe8321SBarry Smith PetscErrorCode ierr; 1663a40ed3dSBarry Smith 1673a40ed3dSBarry Smith PetscFunctionBegin; 1685609ef8eSBarry Smith ierr = MatDuplicate_SeqDense(A,MAT_DO_NOT_COPY_VALUES,fact);CHKERRQ(ierr); 1693a40ed3dSBarry Smith PetscFunctionReturn(0); 170289bc588SBarry Smith } 1716ee01492SSatish Balay 1724a2ae208SSatish Balay #undef __FUNCT__ 1734a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense" 174af281ebdSHong Zhang PetscErrorCode MatLUFactorNumeric_SeqDense(Mat A,MatFactorInfo *info_dummy,Mat *fact) 175289bc588SBarry Smith { 17602cad45dSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l = (Mat_SeqDense*)(*fact)->data; 1776849ba73SBarry Smith PetscErrorCode ierr; 178899cda47SBarry Smith PetscInt lda1=mat->lda,lda2=l->lda, m=A->rmap.n,n=A->cmap.n, j; 1794482741eSBarry Smith MatFactorInfo info; 1803a40ed3dSBarry Smith 1813a40ed3dSBarry Smith PetscFunctionBegin; 18202cad45dSBarry Smith /* copy the numerical values */ 1831b807ce4Svictorle if (lda1>m || lda2>m ) { 1841b807ce4Svictorle for (j=0; j<n; j++) { 1851b807ce4Svictorle ierr = PetscMemcpy(l->v+j*lda2,mat->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1861b807ce4Svictorle } 1871b807ce4Svictorle } else { 188899cda47SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap.n*A->cmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 1891b807ce4Svictorle } 19002cad45dSBarry Smith (*fact)->factor = 0; 1914482741eSBarry Smith ierr = MatLUFactor(*fact,0,0,&info);CHKERRQ(ierr); 1923a40ed3dSBarry Smith PetscFunctionReturn(0); 193289bc588SBarry Smith } 1946ee01492SSatish Balay 1954a2ae208SSatish Balay #undef __FUNCT__ 1964a2ae208SSatish Balay #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense" 197dfbe8321SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat A,IS row,MatFactorInfo *info,Mat *fact) 198289bc588SBarry Smith { 199dfbe8321SBarry Smith PetscErrorCode ierr; 2003a40ed3dSBarry Smith 2013a40ed3dSBarry Smith PetscFunctionBegin; 202ceb03754SKris Buschelman ierr = MatConvert(A,MATSAME,MAT_INITIAL_MATRIX,fact);CHKERRQ(ierr); 2033a40ed3dSBarry Smith PetscFunctionReturn(0); 204289bc588SBarry Smith } 2056ee01492SSatish Balay 2064a2ae208SSatish Balay #undef __FUNCT__ 2074a2ae208SSatish Balay #define __FUNCT__ "MatCholeskyFactor_SeqDense" 208dfbe8321SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,MatFactorInfo *factinfo) 209289bc588SBarry Smith { 210a07ab388SBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 211a07ab388SBarry Smith PetscFunctionBegin; 212a07ab388SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 213a07ab388SBarry Smith #else 214c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 2156849ba73SBarry Smith PetscErrorCode ierr; 216899cda47SBarry Smith PetscBLASInt n = (PetscBLASInt)A->cmap.n,info; 21755659b69SBarry Smith 2183a40ed3dSBarry Smith PetscFunctionBegin; 219606d414cSSatish Balay ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 220752f5567SLois Curfman McInnes mat->pivots = 0; 22105b42c5fSBarry Smith 222899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 22371044d3cSBarry Smith LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info); 22477431f27SBarry Smith if (info) SETERRQ1(PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 225c0bbcb79SLois Curfman McInnes A->factor = FACTOR_CHOLESKY; 226899cda47SBarry Smith ierr = PetscLogFlops((A->cmap.n*A->cmap.n*A->cmap.n)/3);CHKERRQ(ierr); 227a07ab388SBarry Smith #endif 2283a40ed3dSBarry Smith PetscFunctionReturn(0); 229289bc588SBarry Smith } 230289bc588SBarry Smith 2314a2ae208SSatish Balay #undef __FUNCT__ 2320b4b3355SBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense" 233af281ebdSHong Zhang PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat A,MatFactorInfo *info_dummy,Mat *fact) 2340b4b3355SBarry Smith { 235dfbe8321SBarry Smith PetscErrorCode ierr; 23615e8a5b3SHong Zhang MatFactorInfo info; 2370b4b3355SBarry Smith 2380b4b3355SBarry Smith PetscFunctionBegin; 23915e8a5b3SHong Zhang info.fill = 1.0; 24015e8a5b3SHong Zhang ierr = MatCholeskyFactor_SeqDense(*fact,0,&info);CHKERRQ(ierr); 2410b4b3355SBarry Smith PetscFunctionReturn(0); 2420b4b3355SBarry Smith } 2430b4b3355SBarry Smith 2440b4b3355SBarry Smith #undef __FUNCT__ 2454a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense" 246dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 247289bc588SBarry Smith { 248c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 2496849ba73SBarry Smith PetscErrorCode ierr; 250899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt)A->rmap.n, one = 1,info; 25187828ca2SBarry Smith PetscScalar *x,*y; 25267e560aaSBarry Smith 2533a40ed3dSBarry Smith PetscFunctionBegin; 2541ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2551ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 256899cda47SBarry Smith ierr = PetscMemcpy(y,x,A->rmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 257c0bbcb79SLois Curfman McInnes if (A->factor == FACTOR_LU) { 258ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 25980444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 260ae7cfcebSSatish Balay #else 26171044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 2624ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"GETRS - Bad solve"); 263ae7cfcebSSatish Balay #endif 2647a97a34bSBarry Smith } else if (A->factor == FACTOR_CHOLESKY){ 265ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 26680444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 267ae7cfcebSSatish Balay #else 26871044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 2694ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS Bad solve"); 270ae7cfcebSSatish Balay #endif 271289bc588SBarry Smith } 27229bbc08cSBarry Smith else SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 2731ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2741ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 275899cda47SBarry Smith ierr = PetscLogFlops(2*A->cmap.n*A->cmap.n - A->cmap.n);CHKERRQ(ierr); 2763a40ed3dSBarry Smith PetscFunctionReturn(0); 277289bc588SBarry Smith } 2786ee01492SSatish Balay 2794a2ae208SSatish Balay #undef __FUNCT__ 2804a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense" 281dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 282da3a660dSBarry Smith { 283c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 284dfbe8321SBarry Smith PetscErrorCode ierr; 285899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt) A->rmap.n,one = 1,info; 28687828ca2SBarry Smith PetscScalar *x,*y; 28767e560aaSBarry Smith 2883a40ed3dSBarry Smith PetscFunctionBegin; 2891ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2901ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 291899cda47SBarry Smith ierr = PetscMemcpy(y,x,A->rmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 292752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 293da3a660dSBarry Smith if (mat->pivots) { 294ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 29580444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 296ae7cfcebSSatish Balay #else 29771044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 2984ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS - Bad solve"); 299ae7cfcebSSatish Balay #endif 3007a97a34bSBarry Smith } else { 301ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 30280444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 303ae7cfcebSSatish Balay #else 30471044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 3054ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS - Bad solve"); 306ae7cfcebSSatish Balay #endif 307da3a660dSBarry Smith } 3081ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3091ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 310899cda47SBarry Smith ierr = PetscLogFlops(2*A->cmap.n*A->cmap.n - A->cmap.n);CHKERRQ(ierr); 3113a40ed3dSBarry Smith PetscFunctionReturn(0); 312da3a660dSBarry Smith } 3136ee01492SSatish Balay 3144a2ae208SSatish Balay #undef __FUNCT__ 3154a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense" 316dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 317da3a660dSBarry Smith { 318c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 319dfbe8321SBarry Smith PetscErrorCode ierr; 320899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt)A->rmap.n,one = 1,info; 32187828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 322da3a660dSBarry Smith Vec tmp = 0; 32367e560aaSBarry Smith 3243a40ed3dSBarry Smith PetscFunctionBegin; 3251ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 3261ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 327899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 328da3a660dSBarry Smith if (yy == zz) { 32978b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 33052e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 33178b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 332da3a660dSBarry Smith } 333899cda47SBarry Smith ierr = PetscMemcpy(y,x,A->rmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 334752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 335da3a660dSBarry Smith if (mat->pivots) { 336ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 33780444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 338ae7cfcebSSatish Balay #else 33971044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 3402ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 341ae7cfcebSSatish Balay #endif 342a8c6a408SBarry Smith } else { 343ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 34480444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 345ae7cfcebSSatish Balay #else 34671044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 3472ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 348ae7cfcebSSatish Balay #endif 349da3a660dSBarry Smith } 3502dcb1b2aSMatthew Knepley if (tmp) {ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); ierr = VecDestroy(tmp);CHKERRQ(ierr);} 3512dcb1b2aSMatthew Knepley else {ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);} 3521ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3531ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 354899cda47SBarry Smith ierr = PetscLogFlops(2*A->cmap.n*A->cmap.n);CHKERRQ(ierr); 3553a40ed3dSBarry Smith PetscFunctionReturn(0); 356da3a660dSBarry Smith } 35767e560aaSBarry Smith 3584a2ae208SSatish Balay #undef __FUNCT__ 3594a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense" 360dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 361da3a660dSBarry Smith { 362c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 3636849ba73SBarry Smith PetscErrorCode ierr; 364899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt)A->rmap.n,one = 1,info; 36587828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 366da3a660dSBarry Smith Vec tmp; 36767e560aaSBarry Smith 3683a40ed3dSBarry Smith PetscFunctionBegin; 369899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 3701ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 3711ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 372da3a660dSBarry Smith if (yy == zz) { 37378b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 37452e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 37578b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 376da3a660dSBarry Smith } 377899cda47SBarry Smith ierr = PetscMemcpy(y,x,A->rmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 378752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 379da3a660dSBarry Smith if (mat->pivots) { 380ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 38180444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 382ae7cfcebSSatish Balay #else 38371044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 3842ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 385ae7cfcebSSatish Balay #endif 3863a40ed3dSBarry Smith } else { 387ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 38880444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 389ae7cfcebSSatish Balay #else 39071044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 3912ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 392ae7cfcebSSatish Balay #endif 393da3a660dSBarry Smith } 39490f02eecSBarry Smith if (tmp) { 3952dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 39690f02eecSBarry Smith ierr = VecDestroy(tmp);CHKERRQ(ierr); 3973a40ed3dSBarry Smith } else { 3982dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 39990f02eecSBarry Smith } 4001ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 4011ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 402899cda47SBarry Smith ierr = PetscLogFlops(2*A->cmap.n*A->cmap.n);CHKERRQ(ierr); 4033a40ed3dSBarry Smith PetscFunctionReturn(0); 404da3a660dSBarry Smith } 405289bc588SBarry Smith /* ------------------------------------------------------------------*/ 4064a2ae208SSatish Balay #undef __FUNCT__ 4074a2ae208SSatish Balay #define __FUNCT__ "MatRelax_SeqDense" 40813f74950SBarry Smith PetscErrorCode MatRelax_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 409289bc588SBarry Smith { 410c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 41187828ca2SBarry Smith PetscScalar *x,*b,*v = mat->v,zero = 0.0,xt; 412dfbe8321SBarry Smith PetscErrorCode ierr; 413899cda47SBarry Smith PetscInt m = A->rmap.n,i; 414aa482453SBarry Smith #if !defined(PETSC_USE_COMPLEX) 4154ce68768SBarry Smith PetscBLASInt bm = (PetscBLASInt)m, o = 1; 416bc1b551cSSatish Balay #endif 417289bc588SBarry Smith 4183a40ed3dSBarry Smith PetscFunctionBegin; 419289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 42071044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 4212dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 422289bc588SBarry Smith } 4231ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 4241ebc52fbSHong Zhang ierr = VecGetArray(bb,&b);CHKERRQ(ierr); 425b965ef7fSBarry Smith its = its*lits; 42677431f27SBarry Smith if (its <= 0) SETERRQ2(PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits); 427289bc588SBarry Smith while (its--) { 428fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){ 429289bc588SBarry Smith for (i=0; i<m; i++) { 430aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 431f1747703SBarry Smith /* cannot use BLAS dot for complex because compiler/linker is 432f1747703SBarry Smith not happy about returning a double complex */ 43313f74950SBarry Smith PetscInt _i; 43487828ca2SBarry Smith PetscScalar sum = b[i]; 435f1747703SBarry Smith for (_i=0; _i<m; _i++) { 4363f6de6efSSatish Balay sum -= PetscConj(v[i+_i*m])*x[_i]; 437f1747703SBarry Smith } 438f1747703SBarry Smith xt = sum; 439f1747703SBarry Smith #else 44071044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 441f1747703SBarry Smith #endif 44255a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 443289bc588SBarry Smith } 444289bc588SBarry Smith } 445fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){ 446289bc588SBarry Smith for (i=m-1; i>=0; i--) { 447aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 448f1747703SBarry Smith /* cannot use BLAS dot for complex because compiler/linker is 449f1747703SBarry Smith not happy about returning a double complex */ 45013f74950SBarry Smith PetscInt _i; 45187828ca2SBarry Smith PetscScalar sum = b[i]; 452f1747703SBarry Smith for (_i=0; _i<m; _i++) { 4533f6de6efSSatish Balay sum -= PetscConj(v[i+_i*m])*x[_i]; 454f1747703SBarry Smith } 455f1747703SBarry Smith xt = sum; 456f1747703SBarry Smith #else 45771044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 458f1747703SBarry Smith #endif 45955a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 460289bc588SBarry Smith } 461289bc588SBarry Smith } 462289bc588SBarry Smith } 4631ebc52fbSHong Zhang ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr); 4641ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 4653a40ed3dSBarry Smith PetscFunctionReturn(0); 466289bc588SBarry Smith } 467289bc588SBarry Smith 468289bc588SBarry Smith /* -----------------------------------------------------------------*/ 4694a2ae208SSatish Balay #undef __FUNCT__ 4704a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense" 471dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 472289bc588SBarry Smith { 473c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 47487828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 475dfbe8321SBarry Smith PetscErrorCode ierr; 476899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt)A->rmap.n, n = (PetscBLASInt)A->cmap.n,_One=1; 477ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 4783a40ed3dSBarry Smith 4793a40ed3dSBarry Smith PetscFunctionBegin; 480899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 4811ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 4821ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 48371044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One); 4841ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 4851ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 486899cda47SBarry Smith ierr = PetscLogFlops(2*A->rmap.n*A->cmap.n - A->cmap.n);CHKERRQ(ierr); 4873a40ed3dSBarry Smith PetscFunctionReturn(0); 488289bc588SBarry Smith } 4896ee01492SSatish Balay 4904a2ae208SSatish Balay #undef __FUNCT__ 4914a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense" 492dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 493289bc588SBarry Smith { 494c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 49587828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0; 496dfbe8321SBarry Smith PetscErrorCode ierr; 497899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt)A->rmap.n, n = (PetscBLASInt)A->cmap.n, _One=1; 4983a40ed3dSBarry Smith 4993a40ed3dSBarry Smith PetscFunctionBegin; 500899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 5011ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5021ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 50371044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One); 5041ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5051ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 506899cda47SBarry Smith ierr = PetscLogFlops(2*A->rmap.n*A->cmap.n - A->rmap.n);CHKERRQ(ierr); 5073a40ed3dSBarry Smith PetscFunctionReturn(0); 508289bc588SBarry Smith } 5096ee01492SSatish Balay 5104a2ae208SSatish Balay #undef __FUNCT__ 5114a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense" 512dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 513289bc588SBarry Smith { 514c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 51587828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0; 516dfbe8321SBarry Smith PetscErrorCode ierr; 517899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt)A->rmap.n, n = (PetscBLASInt)A->cmap.n, _One=1; 5183a40ed3dSBarry Smith 5193a40ed3dSBarry Smith PetscFunctionBegin; 520899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 521600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 5221ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5231ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 52471044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 5251ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5261ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 527899cda47SBarry Smith ierr = PetscLogFlops(2*A->rmap.n*A->cmap.n);CHKERRQ(ierr); 5283a40ed3dSBarry Smith PetscFunctionReturn(0); 529289bc588SBarry Smith } 5306ee01492SSatish Balay 5314a2ae208SSatish Balay #undef __FUNCT__ 5324a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense" 533dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 534289bc588SBarry Smith { 535c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 53687828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 537dfbe8321SBarry Smith PetscErrorCode ierr; 538899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt)A->rmap.n, n = (PetscBLASInt)A->cmap.n, _One=1; 53987828ca2SBarry Smith PetscScalar _DOne=1.0; 5403a40ed3dSBarry Smith 5413a40ed3dSBarry Smith PetscFunctionBegin; 542899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 543600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 5441ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5451ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 54671044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 5471ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5481ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 549899cda47SBarry Smith ierr = PetscLogFlops(2*A->rmap.n*A->cmap.n);CHKERRQ(ierr); 5503a40ed3dSBarry Smith PetscFunctionReturn(0); 551289bc588SBarry Smith } 552289bc588SBarry Smith 553289bc588SBarry Smith /* -----------------------------------------------------------------*/ 5544a2ae208SSatish Balay #undef __FUNCT__ 5554a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense" 55613f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 557289bc588SBarry Smith { 558c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 55987828ca2SBarry Smith PetscScalar *v; 5606849ba73SBarry Smith PetscErrorCode ierr; 56113f74950SBarry Smith PetscInt i; 56267e560aaSBarry Smith 5633a40ed3dSBarry Smith PetscFunctionBegin; 564899cda47SBarry Smith *ncols = A->cmap.n; 565289bc588SBarry Smith if (cols) { 566899cda47SBarry Smith ierr = PetscMalloc((A->cmap.n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr); 567899cda47SBarry Smith for (i=0; i<A->cmap.n; i++) (*cols)[i] = i; 568289bc588SBarry Smith } 569289bc588SBarry Smith if (vals) { 570899cda47SBarry Smith ierr = PetscMalloc((A->cmap.n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr); 571289bc588SBarry Smith v = mat->v + row; 572899cda47SBarry Smith for (i=0; i<A->cmap.n; i++) {(*vals)[i] = *v; v += mat->lda;} 573289bc588SBarry Smith } 5743a40ed3dSBarry Smith PetscFunctionReturn(0); 575289bc588SBarry Smith } 5766ee01492SSatish Balay 5774a2ae208SSatish Balay #undef __FUNCT__ 5784a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense" 57913f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 580289bc588SBarry Smith { 581dfbe8321SBarry Smith PetscErrorCode ierr; 582606d414cSSatish Balay PetscFunctionBegin; 583606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 584606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 5853a40ed3dSBarry Smith PetscFunctionReturn(0); 586289bc588SBarry Smith } 587289bc588SBarry Smith /* ----------------------------------------------------------------*/ 5884a2ae208SSatish Balay #undef __FUNCT__ 5894a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense" 59013f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 591289bc588SBarry Smith { 592c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 59313f74950SBarry Smith PetscInt i,j,idx=0; 594d6dfbf8fSBarry Smith 5953a40ed3dSBarry Smith PetscFunctionBegin; 596289bc588SBarry Smith if (!mat->roworiented) { 597dbb450caSBarry Smith if (addv == INSERT_VALUES) { 598289bc588SBarry Smith for (j=0; j<n; j++) { 599cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 6002515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 601899cda47SBarry Smith if (indexn[j] >= A->cmap.n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap.n-1); 60258804f6dSBarry Smith #endif 603289bc588SBarry Smith for (i=0; i<m; i++) { 604cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 6052515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 606899cda47SBarry Smith if (indexm[i] >= A->rmap.n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap.n-1); 60758804f6dSBarry Smith #endif 608cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 609289bc588SBarry Smith } 610289bc588SBarry Smith } 6113a40ed3dSBarry Smith } else { 612289bc588SBarry Smith for (j=0; j<n; j++) { 613cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 6142515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 615899cda47SBarry Smith if (indexn[j] >= A->cmap.n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap.n-1); 61658804f6dSBarry Smith #endif 617289bc588SBarry Smith for (i=0; i<m; i++) { 618cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 6192515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 620899cda47SBarry Smith if (indexm[i] >= A->rmap.n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap.n-1); 62158804f6dSBarry Smith #endif 622cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 623289bc588SBarry Smith } 624289bc588SBarry Smith } 625289bc588SBarry Smith } 6263a40ed3dSBarry Smith } else { 627dbb450caSBarry Smith if (addv == INSERT_VALUES) { 628e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 629cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 6302515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 631899cda47SBarry Smith if (indexm[i] >= A->rmap.n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap.n-1); 63258804f6dSBarry Smith #endif 633e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 634cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 6352515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 636899cda47SBarry Smith if (indexn[j] >= A->cmap.n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap.n-1); 63758804f6dSBarry Smith #endif 638cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 639e8d4e0b9SBarry Smith } 640e8d4e0b9SBarry Smith } 6413a40ed3dSBarry Smith } else { 642289bc588SBarry Smith for (i=0; i<m; i++) { 643cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 6442515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 645899cda47SBarry Smith if (indexm[i] >= A->rmap.n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap.n-1); 64658804f6dSBarry Smith #endif 647289bc588SBarry Smith for (j=0; j<n; j++) { 648cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 6492515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 650899cda47SBarry Smith if (indexn[j] >= A->cmap.n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap.n-1); 65158804f6dSBarry Smith #endif 652cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 653289bc588SBarry Smith } 654289bc588SBarry Smith } 655289bc588SBarry Smith } 656e8d4e0b9SBarry Smith } 6573a40ed3dSBarry Smith PetscFunctionReturn(0); 658289bc588SBarry Smith } 659e8d4e0b9SBarry Smith 6604a2ae208SSatish Balay #undef __FUNCT__ 6614a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense" 66213f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 663ae80bb75SLois Curfman McInnes { 664ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 66513f74950SBarry Smith PetscInt i,j; 66687828ca2SBarry Smith PetscScalar *vpt = v; 667ae80bb75SLois Curfman McInnes 6683a40ed3dSBarry Smith PetscFunctionBegin; 669ae80bb75SLois Curfman McInnes /* row-oriented output */ 670ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 671ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 6721b807ce4Svictorle *vpt++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 673ae80bb75SLois Curfman McInnes } 674ae80bb75SLois Curfman McInnes } 6753a40ed3dSBarry Smith PetscFunctionReturn(0); 676ae80bb75SLois Curfman McInnes } 677ae80bb75SLois Curfman McInnes 678289bc588SBarry Smith /* -----------------------------------------------------------------*/ 679289bc588SBarry Smith 680e090d566SSatish Balay #include "petscsys.h" 68188e32edaSLois Curfman McInnes 6824a2ae208SSatish Balay #undef __FUNCT__ 6834a2ae208SSatish Balay #define __FUNCT__ "MatLoad_SeqDense" 684f69a0ea3SMatthew Knepley PetscErrorCode MatLoad_SeqDense(PetscViewer viewer, MatType type,Mat *A) 68588e32edaSLois Curfman McInnes { 68688e32edaSLois Curfman McInnes Mat_SeqDense *a; 68788e32edaSLois Curfman McInnes Mat B; 6886849ba73SBarry Smith PetscErrorCode ierr; 68913f74950SBarry Smith PetscInt *scols,i,j,nz,header[4]; 69013f74950SBarry Smith int fd; 69113f74950SBarry Smith PetscMPIInt size; 69213f74950SBarry Smith PetscInt *rowlengths = 0,M,N,*cols; 69387828ca2SBarry Smith PetscScalar *vals,*svals,*v,*w; 69419bcc07fSBarry Smith MPI_Comm comm = ((PetscObject)viewer)->comm; 69588e32edaSLois Curfman McInnes 6963a40ed3dSBarry Smith PetscFunctionBegin; 697d132466eSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 69829bbc08cSBarry Smith if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"view must have one processor"); 699b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 7000752156aSBarry Smith ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 701552e946dSBarry Smith if (header[0] != MAT_FILE_COOKIE) SETERRQ(PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 70288e32edaSLois Curfman McInnes M = header[1]; N = header[2]; nz = header[3]; 70388e32edaSLois Curfman McInnes 70490ace30eSBarry Smith if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 705f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 706f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,M,N,M,N);CHKERRQ(ierr); 707be5d1d56SKris Buschelman ierr = MatSetType(*A,type);CHKERRQ(ierr); 7085c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(*A,PETSC_NULL);CHKERRQ(ierr); 70990ace30eSBarry Smith B = *A; 71090ace30eSBarry Smith a = (Mat_SeqDense*)B->data; 7114a41a4d3SSatish Balay v = a->v; 7124a41a4d3SSatish Balay /* Allocate some temp space to read in the values and then flip them 7134a41a4d3SSatish Balay from row major to column major */ 714b72907f3SBarry Smith ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr); 71590ace30eSBarry Smith /* read in nonzero values */ 7164a41a4d3SSatish Balay ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 7174a41a4d3SSatish Balay /* now flip the values and store them in the matrix*/ 7184a41a4d3SSatish Balay for (j=0; j<N; j++) { 7194a41a4d3SSatish Balay for (i=0; i<M; i++) { 7204a41a4d3SSatish Balay *v++ =w[i*N+j]; 7214a41a4d3SSatish Balay } 7224a41a4d3SSatish Balay } 723606d414cSSatish Balay ierr = PetscFree(w);CHKERRQ(ierr); 7246d4a8577SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 7256d4a8577SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 72690ace30eSBarry Smith } else { 72788e32edaSLois Curfman McInnes /* read row lengths */ 72813f74950SBarry Smith ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr); 7290752156aSBarry Smith ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 73088e32edaSLois Curfman McInnes 73188e32edaSLois Curfman McInnes /* create our matrix */ 732f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 733f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,M,N,M,N);CHKERRQ(ierr); 734be5d1d56SKris Buschelman ierr = MatSetType(*A,type);CHKERRQ(ierr); 7355c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(*A,PETSC_NULL);CHKERRQ(ierr); 73688e32edaSLois Curfman McInnes B = *A; 73788e32edaSLois Curfman McInnes a = (Mat_SeqDense*)B->data; 73888e32edaSLois Curfman McInnes v = a->v; 73988e32edaSLois Curfman McInnes 74088e32edaSLois Curfman McInnes /* read column indices and nonzeros */ 74113f74950SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr); 742b0a32e0cSBarry Smith cols = scols; 7430752156aSBarry Smith ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 74487828ca2SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr); 745b0a32e0cSBarry Smith vals = svals; 7460752156aSBarry Smith ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 74788e32edaSLois Curfman McInnes 74888e32edaSLois Curfman McInnes /* insert into matrix */ 74988e32edaSLois Curfman McInnes for (i=0; i<M; i++) { 75088e32edaSLois Curfman McInnes for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 75188e32edaSLois Curfman McInnes svals += rowlengths[i]; scols += rowlengths[i]; 75288e32edaSLois Curfman McInnes } 753606d414cSSatish Balay ierr = PetscFree(vals);CHKERRQ(ierr); 754606d414cSSatish Balay ierr = PetscFree(cols);CHKERRQ(ierr); 755606d414cSSatish Balay ierr = PetscFree(rowlengths);CHKERRQ(ierr); 75688e32edaSLois Curfman McInnes 7576d4a8577SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 7586d4a8577SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 75990ace30eSBarry Smith } 7603a40ed3dSBarry Smith PetscFunctionReturn(0); 76188e32edaSLois Curfman McInnes } 76288e32edaSLois Curfman McInnes 763e090d566SSatish Balay #include "petscsys.h" 764932b0c3eSLois Curfman McInnes 7654a2ae208SSatish Balay #undef __FUNCT__ 7664a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII" 7676849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 768289bc588SBarry Smith { 769932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 770dfbe8321SBarry Smith PetscErrorCode ierr; 77113f74950SBarry Smith PetscInt i,j; 7722dcb1b2aSMatthew Knepley const char *name; 77387828ca2SBarry Smith PetscScalar *v; 774f3ef73ceSBarry Smith PetscViewerFormat format; 7755f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX) 7765f481a85SSatish Balay PetscTruth allreal = PETSC_TRUE; 7775f481a85SSatish Balay #endif 778932b0c3eSLois Curfman McInnes 7793a40ed3dSBarry Smith PetscFunctionBegin; 780435da068SBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 781b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 782456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 7833a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 784fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 785b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 786899cda47SBarry Smith for (i=0; i<A->rmap.n; i++) { 78744cd7ae7SLois Curfman McInnes v = a->v + i; 78877431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 789899cda47SBarry Smith for (j=0; j<A->cmap.n; j++) { 790aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 791329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 792a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 793329f5518SBarry Smith } else if (PetscRealPart(*v)) { 794a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr); 7956831982aSBarry Smith } 79680cd9d93SLois Curfman McInnes #else 7976831982aSBarry Smith if (*v) { 798a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr); 7996831982aSBarry Smith } 80080cd9d93SLois Curfman McInnes #endif 8011b807ce4Svictorle v += a->lda; 80280cd9d93SLois Curfman McInnes } 803b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 80480cd9d93SLois Curfman McInnes } 805b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 8063a40ed3dSBarry Smith } else { 807b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 808aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 80947989497SBarry Smith /* determine if matrix has all real values */ 81047989497SBarry Smith v = a->v; 811899cda47SBarry Smith for (i=0; i<A->rmap.n*A->cmap.n; i++) { 812ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;} 81347989497SBarry Smith } 81447989497SBarry Smith #endif 815fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 8163a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 817899cda47SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap.n,A->cmap.n);CHKERRQ(ierr); 818899cda47SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap.n,A->cmap.n);CHKERRQ(ierr); 819fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 820ffac6cdbSBarry Smith } 821ffac6cdbSBarry Smith 822899cda47SBarry Smith for (i=0; i<A->rmap.n; i++) { 823932b0c3eSLois Curfman McInnes v = a->v + i; 824899cda47SBarry Smith for (j=0; j<A->cmap.n; j++) { 825aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 82647989497SBarry Smith if (allreal) { 827f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",PetscRealPart(*v));CHKERRQ(ierr); 82847989497SBarry Smith } else { 829f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16e i ",PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 83047989497SBarry Smith } 831289bc588SBarry Smith #else 832f32d5d43SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",*v);CHKERRQ(ierr); 833289bc588SBarry Smith #endif 8341b807ce4Svictorle v += a->lda; 835289bc588SBarry Smith } 836b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 837289bc588SBarry Smith } 838fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 839b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 840ffac6cdbSBarry Smith } 841b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 842da3a660dSBarry Smith } 843b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 8443a40ed3dSBarry Smith PetscFunctionReturn(0); 845289bc588SBarry Smith } 846289bc588SBarry Smith 8474a2ae208SSatish Balay #undef __FUNCT__ 8484a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary" 8496849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 850932b0c3eSLois Curfman McInnes { 851932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 8526849ba73SBarry Smith PetscErrorCode ierr; 85313f74950SBarry Smith int fd; 854899cda47SBarry Smith PetscInt ict,j,n = A->cmap.n,m = A->rmap.n,i,*col_lens,nz = m*n; 85587828ca2SBarry Smith PetscScalar *v,*anonz,*vals; 856f3ef73ceSBarry Smith PetscViewerFormat format; 857932b0c3eSLois Curfman McInnes 8583a40ed3dSBarry Smith PetscFunctionBegin; 859b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 86090ace30eSBarry Smith 861b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 862fb9695e5SSatish Balay if (format == PETSC_VIEWER_BINARY_NATIVE) { 86390ace30eSBarry Smith /* store the matrix as a dense matrix */ 86413f74950SBarry Smith ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 865552e946dSBarry Smith col_lens[0] = MAT_FILE_COOKIE; 86690ace30eSBarry Smith col_lens[1] = m; 86790ace30eSBarry Smith col_lens[2] = n; 86890ace30eSBarry Smith col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 8696f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 870606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 87190ace30eSBarry Smith 87290ace30eSBarry Smith /* write out matrix, by rows */ 87387828ca2SBarry Smith ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr); 87490ace30eSBarry Smith v = a->v; 87590ace30eSBarry Smith for (i=0; i<m; i++) { 87690ace30eSBarry Smith for (j=0; j<n; j++) { 87790ace30eSBarry Smith vals[i + j*m] = *v++; 87890ace30eSBarry Smith } 87990ace30eSBarry Smith } 8806f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 881606d414cSSatish Balay ierr = PetscFree(vals);CHKERRQ(ierr); 88290ace30eSBarry Smith } else { 88313f74950SBarry Smith ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 884552e946dSBarry Smith col_lens[0] = MAT_FILE_COOKIE; 885932b0c3eSLois Curfman McInnes col_lens[1] = m; 886932b0c3eSLois Curfman McInnes col_lens[2] = n; 887932b0c3eSLois Curfman McInnes col_lens[3] = nz; 888932b0c3eSLois Curfman McInnes 889932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 890932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 8916f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 892932b0c3eSLois Curfman McInnes 893932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 894932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 895932b0c3eSLois Curfman McInnes ict = 0; 896932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 897932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 898932b0c3eSLois Curfman McInnes } 8996f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 900606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 901932b0c3eSLois Curfman McInnes 902932b0c3eSLois Curfman McInnes /* store nonzero values */ 90387828ca2SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr); 904932b0c3eSLois Curfman McInnes ict = 0; 905932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 906932b0c3eSLois Curfman McInnes v = a->v + i; 907932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 9081b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 909932b0c3eSLois Curfman McInnes } 910932b0c3eSLois Curfman McInnes } 9116f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 912606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 91390ace30eSBarry Smith } 9143a40ed3dSBarry Smith PetscFunctionReturn(0); 915932b0c3eSLois Curfman McInnes } 916932b0c3eSLois Curfman McInnes 9174a2ae208SSatish Balay #undef __FUNCT__ 9184a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom" 919dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 920f1af5d2fSBarry Smith { 921f1af5d2fSBarry Smith Mat A = (Mat) Aa; 922f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 9236849ba73SBarry Smith PetscErrorCode ierr; 924899cda47SBarry Smith PetscInt m = A->rmap.n,n = A->cmap.n,color,i,j; 92587828ca2SBarry Smith PetscScalar *v = a->v; 926b0a32e0cSBarry Smith PetscViewer viewer; 927b0a32e0cSBarry Smith PetscDraw popup; 928329f5518SBarry Smith PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0; 929f3ef73ceSBarry Smith PetscViewerFormat format; 930f1af5d2fSBarry Smith 931f1af5d2fSBarry Smith PetscFunctionBegin; 932f1af5d2fSBarry Smith 933f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 934b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 935b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 936f1af5d2fSBarry Smith 937f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 938fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 939f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 940b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 941f1af5d2fSBarry Smith for(j = 0; j < n; j++) { 942f1af5d2fSBarry Smith x_l = j; 943f1af5d2fSBarry Smith x_r = x_l + 1.0; 944f1af5d2fSBarry Smith for(i = 0; i < m; i++) { 945f1af5d2fSBarry Smith y_l = m - i - 1.0; 946f1af5d2fSBarry Smith y_r = y_l + 1.0; 947f1af5d2fSBarry Smith #if defined(PETSC_USE_COMPLEX) 948329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 949b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 950329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 951b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 952f1af5d2fSBarry Smith } else { 953f1af5d2fSBarry Smith continue; 954f1af5d2fSBarry Smith } 955f1af5d2fSBarry Smith #else 956f1af5d2fSBarry Smith if (v[j*m+i] > 0.) { 957b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 958f1af5d2fSBarry Smith } else if (v[j*m+i] < 0.) { 959b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 960f1af5d2fSBarry Smith } else { 961f1af5d2fSBarry Smith continue; 962f1af5d2fSBarry Smith } 963f1af5d2fSBarry Smith #endif 964b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 965f1af5d2fSBarry Smith } 966f1af5d2fSBarry Smith } 967f1af5d2fSBarry Smith } else { 968f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 969f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 970f1af5d2fSBarry Smith for(i = 0; i < m*n; i++) { 971f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 972f1af5d2fSBarry Smith } 973b0a32e0cSBarry Smith scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv; 974b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 975b0a32e0cSBarry Smith if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);} 976f1af5d2fSBarry Smith for(j = 0; j < n; j++) { 977f1af5d2fSBarry Smith x_l = j; 978f1af5d2fSBarry Smith x_r = x_l + 1.0; 979f1af5d2fSBarry Smith for(i = 0; i < m; i++) { 980f1af5d2fSBarry Smith y_l = m - i - 1.0; 981f1af5d2fSBarry Smith y_r = y_l + 1.0; 982b0a32e0cSBarry Smith color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i])); 983b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 984f1af5d2fSBarry Smith } 985f1af5d2fSBarry Smith } 986f1af5d2fSBarry Smith } 987f1af5d2fSBarry Smith PetscFunctionReturn(0); 988f1af5d2fSBarry Smith } 989f1af5d2fSBarry Smith 9904a2ae208SSatish Balay #undef __FUNCT__ 9914a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 992dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 993f1af5d2fSBarry Smith { 994b0a32e0cSBarry Smith PetscDraw draw; 995f1af5d2fSBarry Smith PetscTruth isnull; 996329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 997dfbe8321SBarry Smith PetscErrorCode ierr; 998f1af5d2fSBarry Smith 999f1af5d2fSBarry Smith PetscFunctionBegin; 1000b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 1001b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 1002abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 1003f1af5d2fSBarry Smith 1004f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 1005899cda47SBarry Smith xr = A->cmap.n; yr = A->rmap.n; h = yr/10.0; w = xr/10.0; 1006f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 1007b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 1008b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 1009f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr); 1010f1af5d2fSBarry Smith PetscFunctionReturn(0); 1011f1af5d2fSBarry Smith } 1012f1af5d2fSBarry Smith 10134a2ae208SSatish Balay #undef __FUNCT__ 10144a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 1015dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 1016932b0c3eSLois Curfman McInnes { 1017dfbe8321SBarry Smith PetscErrorCode ierr; 10186805f65bSBarry Smith PetscTruth iascii,isbinary,isdraw; 1019932b0c3eSLois Curfman McInnes 10203a40ed3dSBarry Smith PetscFunctionBegin; 102132077d6dSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 1022fb9695e5SSatish Balay ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr); 1023fb9695e5SSatish Balay ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_DRAW,&isdraw);CHKERRQ(ierr); 10240f5bd95cSBarry Smith 1025c45a1595SBarry Smith if (iascii) { 1026c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 10270f5bd95cSBarry Smith } else if (isbinary) { 10283a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1029f1af5d2fSBarry Smith } else if (isdraw) { 1030f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 10315cd90555SBarry Smith } else { 1032958c9bccSBarry Smith SETERRQ1(PETSC_ERR_SUP,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name); 1033932b0c3eSLois Curfman McInnes } 10343a40ed3dSBarry Smith PetscFunctionReturn(0); 1035932b0c3eSLois Curfman McInnes } 1036289bc588SBarry Smith 10374a2ae208SSatish Balay #undef __FUNCT__ 10384a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1039dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat) 1040289bc588SBarry Smith { 1041ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1042dfbe8321SBarry Smith PetscErrorCode ierr; 104390f02eecSBarry Smith 10443a40ed3dSBarry Smith PetscFunctionBegin; 1045aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1046899cda47SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap.n,mat->cmap.n); 1047a5a9c739SBarry Smith #endif 104805b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 10496857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1050606d414cSSatish Balay ierr = PetscFree(l);CHKERRQ(ierr); 1051dbd8c25aSHong Zhang 1052dbd8c25aSHong Zhang ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr); 1053901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr); 10544ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMult_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 10554ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 10564ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C","",PETSC_NULL);CHKERRQ(ierr); 10573a40ed3dSBarry Smith PetscFunctionReturn(0); 1058289bc588SBarry Smith } 1059289bc588SBarry Smith 10604a2ae208SSatish Balay #undef __FUNCT__ 10614a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1062dfbe8321SBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,Mat *matout) 1063289bc588SBarry Smith { 1064c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 10656849ba73SBarry Smith PetscErrorCode ierr; 106613f74950SBarry Smith PetscInt k,j,m,n,M; 106787828ca2SBarry Smith PetscScalar *v,tmp; 106848b35521SBarry Smith 10693a40ed3dSBarry Smith PetscFunctionBegin; 1070899cda47SBarry Smith v = mat->v; m = A->rmap.n; M = mat->lda; n = A->cmap.n; 10717c922b88SBarry Smith if (!matout) { /* in place transpose */ 1072a5ce6ee0Svictorle if (m != n) { 1073634064b4SBarry Smith SETERRQ(PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1074d64ed03dSBarry Smith } else { 1075d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1076289bc588SBarry Smith for (k=0; k<j; k++) { 10771b807ce4Svictorle tmp = v[j + k*M]; 10781b807ce4Svictorle v[j + k*M] = v[k + j*M]; 10791b807ce4Svictorle v[k + j*M] = tmp; 1080289bc588SBarry Smith } 1081289bc588SBarry Smith } 1082d64ed03dSBarry Smith } 10833a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1084d3e5ee88SLois Curfman McInnes Mat tmat; 1085ec8511deSBarry Smith Mat_SeqDense *tmatd; 108687828ca2SBarry Smith PetscScalar *v2; 1087ea709b57SSatish Balay 1088f69a0ea3SMatthew Knepley ierr = MatCreate(A->comm,&tmat);CHKERRQ(ierr); 1089899cda47SBarry Smith ierr = MatSetSizes(tmat,A->cmap.n,A->rmap.n,A->cmap.n,A->rmap.n);CHKERRQ(ierr); 10905c5985e7SKris Buschelman ierr = MatSetType(tmat,A->type_name);CHKERRQ(ierr); 10915c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr); 1092ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 10930de55854SLois Curfman McInnes v = mat->v; v2 = tmatd->v; 1094d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 10951b807ce4Svictorle for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M]; 1096d3e5ee88SLois Curfman McInnes } 10976d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 10986d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1099d3e5ee88SLois Curfman McInnes *matout = tmat; 110048b35521SBarry Smith } 11013a40ed3dSBarry Smith PetscFunctionReturn(0); 1102289bc588SBarry Smith } 1103289bc588SBarry Smith 11044a2ae208SSatish Balay #undef __FUNCT__ 11054a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1106dfbe8321SBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscTruth *flg) 1107289bc588SBarry Smith { 1108c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1109c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 111013f74950SBarry Smith PetscInt i,j; 111187828ca2SBarry Smith PetscScalar *v1 = mat1->v,*v2 = mat2->v; 11129ea5d5aeSSatish Balay 11133a40ed3dSBarry Smith PetscFunctionBegin; 1114899cda47SBarry Smith if (A1->rmap.n != A2->rmap.n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1115899cda47SBarry Smith if (A1->cmap.n != A2->cmap.n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1116899cda47SBarry Smith for (i=0; i<A1->rmap.n; i++) { 11171b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1118899cda47SBarry Smith for (j=0; j<A1->cmap.n; j++) { 11193a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 11201b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 11211b807ce4Svictorle } 1122289bc588SBarry Smith } 112377c4ece6SBarry Smith *flg = PETSC_TRUE; 11243a40ed3dSBarry Smith PetscFunctionReturn(0); 1125289bc588SBarry Smith } 1126289bc588SBarry Smith 11274a2ae208SSatish Balay #undef __FUNCT__ 11284a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1129dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1130289bc588SBarry Smith { 1131c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1132dfbe8321SBarry Smith PetscErrorCode ierr; 113313f74950SBarry Smith PetscInt i,n,len; 113487828ca2SBarry Smith PetscScalar *x,zero = 0.0; 113544cd7ae7SLois Curfman McInnes 11363a40ed3dSBarry Smith PetscFunctionBegin; 11372dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 11387a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 11391ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1140899cda47SBarry Smith len = PetscMin(A->rmap.n,A->cmap.n); 1141899cda47SBarry Smith if (n != A->rmap.n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 114244cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 11431b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1144289bc588SBarry Smith } 11451ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 11463a40ed3dSBarry Smith PetscFunctionReturn(0); 1147289bc588SBarry Smith } 1148289bc588SBarry Smith 11494a2ae208SSatish Balay #undef __FUNCT__ 11504a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1151dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1152289bc588SBarry Smith { 1153c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 115487828ca2SBarry Smith PetscScalar *l,*r,x,*v; 1155dfbe8321SBarry Smith PetscErrorCode ierr; 1156899cda47SBarry Smith PetscInt i,j,m = A->rmap.n,n = A->cmap.n; 115755659b69SBarry Smith 11583a40ed3dSBarry Smith PetscFunctionBegin; 115928988994SBarry Smith if (ll) { 11607a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 11611ebc52fbSHong Zhang ierr = VecGetArray(ll,&l);CHKERRQ(ierr); 1162899cda47SBarry Smith if (m != A->rmap.n) SETERRQ(PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1163da3a660dSBarry Smith for (i=0; i<m; i++) { 1164da3a660dSBarry Smith x = l[i]; 1165da3a660dSBarry Smith v = mat->v + i; 1166da3a660dSBarry Smith for (j=0; j<n; j++) { (*v) *= x; v+= m;} 1167da3a660dSBarry Smith } 11681ebc52fbSHong Zhang ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr); 1169efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1170da3a660dSBarry Smith } 117128988994SBarry Smith if (rr) { 11727a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 11731ebc52fbSHong Zhang ierr = VecGetArray(rr,&r);CHKERRQ(ierr); 1174899cda47SBarry Smith if (n != A->cmap.n) SETERRQ(PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1175da3a660dSBarry Smith for (i=0; i<n; i++) { 1176da3a660dSBarry Smith x = r[i]; 1177da3a660dSBarry Smith v = mat->v + i*m; 1178da3a660dSBarry Smith for (j=0; j<m; j++) { (*v++) *= x;} 1179da3a660dSBarry Smith } 11801ebc52fbSHong Zhang ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr); 1181efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1182da3a660dSBarry Smith } 11833a40ed3dSBarry Smith PetscFunctionReturn(0); 1184289bc588SBarry Smith } 1185289bc588SBarry Smith 11864a2ae208SSatish Balay #undef __FUNCT__ 11874a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1188dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1189289bc588SBarry Smith { 1190c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 119187828ca2SBarry Smith PetscScalar *v = mat->v; 1192329f5518SBarry Smith PetscReal sum = 0.0; 1193899cda47SBarry Smith PetscInt lda=mat->lda,m=A->rmap.n,i,j; 1194efee365bSSatish Balay PetscErrorCode ierr; 119555659b69SBarry Smith 11963a40ed3dSBarry Smith PetscFunctionBegin; 1197289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1198a5ce6ee0Svictorle if (lda>m) { 1199899cda47SBarry Smith for (j=0; j<A->cmap.n; j++) { 1200a5ce6ee0Svictorle v = mat->v+j*lda; 1201a5ce6ee0Svictorle for (i=0; i<m; i++) { 1202a5ce6ee0Svictorle #if defined(PETSC_USE_COMPLEX) 1203a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1204a5ce6ee0Svictorle #else 1205a5ce6ee0Svictorle sum += (*v)*(*v); v++; 1206a5ce6ee0Svictorle #endif 1207a5ce6ee0Svictorle } 1208a5ce6ee0Svictorle } 1209a5ce6ee0Svictorle } else { 1210899cda47SBarry Smith for (i=0; i<A->cmap.n*A->rmap.n; i++) { 1211aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1212329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1213289bc588SBarry Smith #else 1214289bc588SBarry Smith sum += (*v)*(*v); v++; 1215289bc588SBarry Smith #endif 1216289bc588SBarry Smith } 1217a5ce6ee0Svictorle } 1218064f8208SBarry Smith *nrm = sqrt(sum); 1219899cda47SBarry Smith ierr = PetscLogFlops(2*A->cmap.n*A->rmap.n);CHKERRQ(ierr); 12203a40ed3dSBarry Smith } else if (type == NORM_1) { 1221064f8208SBarry Smith *nrm = 0.0; 1222899cda47SBarry Smith for (j=0; j<A->cmap.n; j++) { 12231b807ce4Svictorle v = mat->v + j*mat->lda; 1224289bc588SBarry Smith sum = 0.0; 1225899cda47SBarry Smith for (i=0; i<A->rmap.n; i++) { 122633a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1227289bc588SBarry Smith } 1228064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1229289bc588SBarry Smith } 1230899cda47SBarry Smith ierr = PetscLogFlops(A->cmap.n*A->rmap.n);CHKERRQ(ierr); 12313a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1232064f8208SBarry Smith *nrm = 0.0; 1233899cda47SBarry Smith for (j=0; j<A->rmap.n; j++) { 1234289bc588SBarry Smith v = mat->v + j; 1235289bc588SBarry Smith sum = 0.0; 1236899cda47SBarry Smith for (i=0; i<A->cmap.n; i++) { 12371b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1238289bc588SBarry Smith } 1239064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1240289bc588SBarry Smith } 1241899cda47SBarry Smith ierr = PetscLogFlops(A->cmap.n*A->rmap.n);CHKERRQ(ierr); 12423a40ed3dSBarry Smith } else { 124329bbc08cSBarry Smith SETERRQ(PETSC_ERR_SUP,"No two norm"); 1244289bc588SBarry Smith } 12453a40ed3dSBarry Smith PetscFunctionReturn(0); 1246289bc588SBarry Smith } 1247289bc588SBarry Smith 12484a2ae208SSatish Balay #undef __FUNCT__ 12494a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1250dfbe8321SBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op) 1251289bc588SBarry Smith { 1252c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 125363ba0a88SBarry Smith PetscErrorCode ierr; 125467e560aaSBarry Smith 12553a40ed3dSBarry Smith PetscFunctionBegin; 1256b5a2b587SKris Buschelman switch (op) { 1257b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 1258b5a2b587SKris Buschelman aij->roworiented = PETSC_TRUE; 1259b5a2b587SKris Buschelman break; 1260b5a2b587SKris Buschelman case MAT_COLUMN_ORIENTED: 1261b5a2b587SKris Buschelman aij->roworiented = PETSC_FALSE; 1262b5a2b587SKris Buschelman break; 1263b5a2b587SKris Buschelman case MAT_ROWS_SORTED: 1264b5a2b587SKris Buschelman case MAT_ROWS_UNSORTED: 1265b5a2b587SKris Buschelman case MAT_COLUMNS_SORTED: 1266b5a2b587SKris Buschelman case MAT_COLUMNS_UNSORTED: 1267b5a2b587SKris Buschelman case MAT_NO_NEW_NONZERO_LOCATIONS: 1268b5a2b587SKris Buschelman case MAT_YES_NEW_NONZERO_LOCATIONS: 1269b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 1270b5a2b587SKris Buschelman case MAT_NO_NEW_DIAGONALS: 1271b5a2b587SKris Buschelman case MAT_YES_NEW_DIAGONALS: 1272b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1273b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 127477e54ba9SKris Buschelman case MAT_SYMMETRIC: 127577e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 12769a4540c5SBarry Smith case MAT_NOT_SYMMETRIC: 12779a4540c5SBarry Smith case MAT_NOT_STRUCTURALLY_SYMMETRIC: 12789a4540c5SBarry Smith case MAT_HERMITIAN: 12799a4540c5SBarry Smith case MAT_NOT_HERMITIAN: 12809a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 12819a4540c5SBarry Smith case MAT_NOT_SYMMETRY_ETERNAL: 1282290bbb0aSBarry Smith ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr); 128377e54ba9SKris Buschelman break; 1284b5a2b587SKris Buschelman default: 1285ad86a440SBarry Smith SETERRQ1(PETSC_ERR_SUP,"unknown option %d",op); 12863a40ed3dSBarry Smith } 12873a40ed3dSBarry Smith PetscFunctionReturn(0); 1288289bc588SBarry Smith } 1289289bc588SBarry Smith 12904a2ae208SSatish Balay #undef __FUNCT__ 12914a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1292dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A) 12936f0a148fSBarry Smith { 1294ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 12956849ba73SBarry Smith PetscErrorCode ierr; 1296899cda47SBarry Smith PetscInt lda=l->lda,m=A->rmap.n,j; 12973a40ed3dSBarry Smith 12983a40ed3dSBarry Smith PetscFunctionBegin; 1299a5ce6ee0Svictorle if (lda>m) { 1300899cda47SBarry Smith for (j=0; j<A->cmap.n; j++) { 1301a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1302a5ce6ee0Svictorle } 1303a5ce6ee0Svictorle } else { 1304899cda47SBarry Smith ierr = PetscMemzero(l->v,A->rmap.n*A->cmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 1305a5ce6ee0Svictorle } 13063a40ed3dSBarry Smith PetscFunctionReturn(0); 13076f0a148fSBarry Smith } 13086f0a148fSBarry Smith 13094a2ae208SSatish Balay #undef __FUNCT__ 13104a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 1311f4df32b1SMatthew Knepley PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag) 13126f0a148fSBarry Smith { 1313ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1314899cda47SBarry Smith PetscInt n = A->cmap.n,i,j; 131587828ca2SBarry Smith PetscScalar *slot; 131655659b69SBarry Smith 13173a40ed3dSBarry Smith PetscFunctionBegin; 13186f0a148fSBarry Smith for (i=0; i<N; i++) { 13196f0a148fSBarry Smith slot = l->v + rows[i]; 13206f0a148fSBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += n;} 13216f0a148fSBarry Smith } 1322f4df32b1SMatthew Knepley if (diag != 0.0) { 13236f0a148fSBarry Smith for (i=0; i<N; i++) { 13246f0a148fSBarry Smith slot = l->v + (n+1)*rows[i]; 1325f4df32b1SMatthew Knepley *slot = diag; 13266f0a148fSBarry Smith } 13276f0a148fSBarry Smith } 13283a40ed3dSBarry Smith PetscFunctionReturn(0); 13296f0a148fSBarry Smith } 1330557bce09SLois Curfman McInnes 13314a2ae208SSatish Balay #undef __FUNCT__ 13324a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqDense" 1333dfbe8321SBarry Smith PetscErrorCode MatGetArray_SeqDense(Mat A,PetscScalar *array[]) 133464e87e97SBarry Smith { 1335c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 13363a40ed3dSBarry Smith 13373a40ed3dSBarry Smith PetscFunctionBegin; 1338899cda47SBarry Smith if (mat->lda != A->rmap.n) SETERRQ(PETSC_ERR_SUP,"Cannot get array for Dense matrices with LDA different from number of rows"); 133964e87e97SBarry Smith *array = mat->v; 13403a40ed3dSBarry Smith PetscFunctionReturn(0); 134164e87e97SBarry Smith } 13420754003eSLois Curfman McInnes 13434a2ae208SSatish Balay #undef __FUNCT__ 13444a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense" 1345dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1346ff14e315SSatish Balay { 13473a40ed3dSBarry Smith PetscFunctionBegin; 134809b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 13493a40ed3dSBarry Smith PetscFunctionReturn(0); 1350ff14e315SSatish Balay } 13510754003eSLois Curfman McInnes 13524a2ae208SSatish Balay #undef __FUNCT__ 13534a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 135413f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 13550754003eSLois Curfman McInnes { 1356c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 13576849ba73SBarry Smith PetscErrorCode ierr; 135821a2c019SBarry Smith PetscInt i,j,*irow,*icol,nrows,ncols; 135987828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 13600754003eSLois Curfman McInnes Mat newmat; 13610754003eSLois Curfman McInnes 13623a40ed3dSBarry Smith PetscFunctionBegin; 136378b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 136478b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1365e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1366e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 13670754003eSLois Curfman McInnes 1368182d2002SSatish Balay /* Check submatrixcall */ 1369182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 137013f74950SBarry Smith PetscInt n_cols,n_rows; 1371182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 137221a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 137321a2c019SBarry Smith /* resize the result result matrix to match number of requested rows/columns */ 137421a2c019SBarry Smith ierr = MatSetSizes(*B,nrows,nrows,nrows,nrows);CHKERRQ(ierr); 137521a2c019SBarry Smith } 1376182d2002SSatish Balay newmat = *B; 1377182d2002SSatish Balay } else { 13780754003eSLois Curfman McInnes /* Create and fill new matrix */ 1379f69a0ea3SMatthew Knepley ierr = MatCreate(A->comm,&newmat);CHKERRQ(ierr); 1380f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 13815c5985e7SKris Buschelman ierr = MatSetType(newmat,A->type_name);CHKERRQ(ierr); 13825c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr); 1383182d2002SSatish Balay } 1384182d2002SSatish Balay 1385182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1386182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1387182d2002SSatish Balay 1388182d2002SSatish Balay for (i=0; i<ncols; i++) { 13896de62eeeSBarry Smith av = v + mat->lda*icol[i]; 1390182d2002SSatish Balay for (j=0; j<nrows; j++) { 1391182d2002SSatish Balay *bv++ = av[irow[j]]; 13920754003eSLois Curfman McInnes } 13930754003eSLois Curfman McInnes } 1394182d2002SSatish Balay 1395182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 13966d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 13976d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 13980754003eSLois Curfman McInnes 13990754003eSLois Curfman McInnes /* Free work space */ 140078b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 140178b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1402182d2002SSatish Balay *B = newmat; 14033a40ed3dSBarry Smith PetscFunctionReturn(0); 14040754003eSLois Curfman McInnes } 14050754003eSLois Curfman McInnes 14064a2ae208SSatish Balay #undef __FUNCT__ 14074a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 140813f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1409905e6a2fSBarry Smith { 14106849ba73SBarry Smith PetscErrorCode ierr; 141113f74950SBarry Smith PetscInt i; 1412905e6a2fSBarry Smith 14133a40ed3dSBarry Smith PetscFunctionBegin; 1414905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1415b0a32e0cSBarry Smith ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr); 1416905e6a2fSBarry Smith } 1417905e6a2fSBarry Smith 1418905e6a2fSBarry Smith for (i=0; i<n; i++) { 14196a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1420905e6a2fSBarry Smith } 14213a40ed3dSBarry Smith PetscFunctionReturn(0); 1422905e6a2fSBarry Smith } 1423905e6a2fSBarry Smith 14244a2ae208SSatish Balay #undef __FUNCT__ 1425c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1426c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1427c0aa2d19SHong Zhang { 1428c0aa2d19SHong Zhang PetscFunctionBegin; 1429c0aa2d19SHong Zhang PetscFunctionReturn(0); 1430c0aa2d19SHong Zhang } 1431c0aa2d19SHong Zhang 1432c0aa2d19SHong Zhang #undef __FUNCT__ 1433c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1434c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1435c0aa2d19SHong Zhang { 1436c0aa2d19SHong Zhang PetscFunctionBegin; 1437c0aa2d19SHong Zhang PetscFunctionReturn(0); 1438c0aa2d19SHong Zhang } 1439c0aa2d19SHong Zhang 1440c0aa2d19SHong Zhang #undef __FUNCT__ 14414a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1442dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 14434b0e389bSBarry Smith { 14444b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data; 14456849ba73SBarry Smith PetscErrorCode ierr; 1446899cda47SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap.n,n=A->cmap.n, j; 14473a40ed3dSBarry Smith 14483a40ed3dSBarry Smith PetscFunctionBegin; 144933f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 145033f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1451cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 14523a40ed3dSBarry Smith PetscFunctionReturn(0); 14533a40ed3dSBarry Smith } 1454899cda47SBarry Smith if (m != B->rmap.n || n != B->cmap.n) SETERRQ(PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1455a5ce6ee0Svictorle if (lda1>m || lda2>m) { 14560dbb7854Svictorle for (j=0; j<n; j++) { 1457a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1458a5ce6ee0Svictorle } 1459a5ce6ee0Svictorle } else { 1460899cda47SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap.n*A->cmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 1461a5ce6ee0Svictorle } 1462273d9f13SBarry Smith PetscFunctionReturn(0); 1463273d9f13SBarry Smith } 1464273d9f13SBarry Smith 14654a2ae208SSatish Balay #undef __FUNCT__ 14664a2ae208SSatish Balay #define __FUNCT__ "MatSetUpPreallocation_SeqDense" 1467dfbe8321SBarry Smith PetscErrorCode MatSetUpPreallocation_SeqDense(Mat A) 1468273d9f13SBarry Smith { 1469dfbe8321SBarry Smith PetscErrorCode ierr; 1470273d9f13SBarry Smith 1471273d9f13SBarry Smith PetscFunctionBegin; 1472273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 14733a40ed3dSBarry Smith PetscFunctionReturn(0); 14744b0e389bSBarry Smith } 14754b0e389bSBarry Smith 1476284134d9SBarry Smith #undef __FUNCT__ 1477284134d9SBarry Smith #define __FUNCT__ "MatSetSizes_SeqDense" 1478284134d9SBarry Smith PetscErrorCode MatSetSizes_SeqDense(Mat A,PetscInt m,PetscInt n,PetscInt M,PetscInt N) 1479284134d9SBarry Smith { 1480284134d9SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 148121a2c019SBarry Smith PetscErrorCode ierr; 1482284134d9SBarry Smith PetscFunctionBegin; 148321a2c019SBarry Smith /* this will not be called before lda, Mmax, and Nmax have been set */ 1484284134d9SBarry Smith m = PetscMax(m,M); 1485284134d9SBarry Smith n = PetscMax(n,N); 148621a2c019SBarry Smith if (m > a->Mmax) SETERRQ2(PETSC_ERR_SUP,"Cannot yet resize number rows of dense matrix larger then its initial size %d, requested %d",a->lda,(int)m); 1487284134d9SBarry Smith if (n > a->Nmax) SETERRQ2(PETSC_ERR_SUP,"Cannot yet resize number columns of dense matrix larger then its initial size %d, requested %d",a->Nmax,(int)n); 1488899cda47SBarry Smith A->rmap.n = A->rmap.n = m; 1489899cda47SBarry Smith A->cmap.n = A->cmap.N = n; 149021a2c019SBarry Smith if (a->changelda) a->lda = m; 149121a2c019SBarry Smith ierr = PetscMemzero(a->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr); 1492284134d9SBarry Smith PetscFunctionReturn(0); 1493284134d9SBarry Smith } 1494284134d9SBarry Smith 1495a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1496a9fe9ddaSSatish Balay #undef __FUNCT__ 1497a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1498a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1499a9fe9ddaSSatish Balay { 1500a9fe9ddaSSatish Balay PetscErrorCode ierr; 1501a9fe9ddaSSatish Balay 1502a9fe9ddaSSatish Balay PetscFunctionBegin; 1503a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX){ 1504a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1505a9fe9ddaSSatish Balay } 1506a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1507a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1508a9fe9ddaSSatish Balay } 1509a9fe9ddaSSatish Balay 1510a9fe9ddaSSatish Balay #undef __FUNCT__ 1511a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1512a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1513a9fe9ddaSSatish Balay { 1514ee16a9a1SHong Zhang PetscErrorCode ierr; 1515899cda47SBarry Smith PetscInt m=A->rmap.n,n=B->cmap.n; 1516ee16a9a1SHong Zhang Mat Cmat; 1517a9fe9ddaSSatish Balay 1518ee16a9a1SHong Zhang PetscFunctionBegin; 1519899cda47SBarry Smith if (A->cmap.n != B->rmap.n) SETERRQ2(PETSC_ERR_ARG_SIZ,"A->cmap.n %d != B->rmap.n %d\n",A->cmap.n,B->rmap.n); 1520ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1521ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1522ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1523ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1524ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 1525ee16a9a1SHong Zhang *C = Cmat; 1526ee16a9a1SHong Zhang PetscFunctionReturn(0); 1527ee16a9a1SHong Zhang } 1528a9fe9ddaSSatish Balay 1529a9fe9ddaSSatish Balay #undef __FUNCT__ 1530a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1531a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1532a9fe9ddaSSatish Balay { 1533a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1534a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1535a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 1536899cda47SBarry Smith PetscBLASInt m=(PetscBLASInt)A->rmap.n,n=(PetscBLASInt)B->cmap.n,k=(PetscBLASInt)A->cmap.n; 1537a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1538a9fe9ddaSSatish Balay 1539a9fe9ddaSSatish Balay PetscFunctionBegin; 1540a9fe9ddaSSatish Balay BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1541a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1542a9fe9ddaSSatish Balay } 1543a9fe9ddaSSatish Balay 1544a9fe9ddaSSatish Balay #undef __FUNCT__ 1545a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTranspose_SeqDense_SeqDense" 1546a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTranspose_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1547a9fe9ddaSSatish Balay { 1548a9fe9ddaSSatish Balay PetscErrorCode ierr; 1549a9fe9ddaSSatish Balay 1550a9fe9ddaSSatish Balay PetscFunctionBegin; 1551a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX){ 1552a9fe9ddaSSatish Balay ierr = MatMatMultTransposeSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1553a9fe9ddaSSatish Balay } 1554a9fe9ddaSSatish Balay ierr = MatMatMultTransposeNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1555a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1556a9fe9ddaSSatish Balay } 1557a9fe9ddaSSatish Balay 1558a9fe9ddaSSatish Balay #undef __FUNCT__ 1559a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeSymbolic_SeqDense_SeqDense" 1560a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1561a9fe9ddaSSatish Balay { 1562ee16a9a1SHong Zhang PetscErrorCode ierr; 1563899cda47SBarry Smith PetscInt m=A->cmap.n,n=B->cmap.n; 1564ee16a9a1SHong Zhang Mat Cmat; 1565a9fe9ddaSSatish Balay 1566ee16a9a1SHong Zhang PetscFunctionBegin; 1567899cda47SBarry Smith if (A->rmap.n != B->rmap.n) SETERRQ2(PETSC_ERR_ARG_SIZ,"A->rmap.n %d != B->rmap.n %d\n",A->rmap.n,B->rmap.n); 1568ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1569ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1570ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1571ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1572ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 1573ee16a9a1SHong Zhang *C = Cmat; 1574ee16a9a1SHong Zhang PetscFunctionReturn(0); 1575ee16a9a1SHong Zhang } 1576a9fe9ddaSSatish Balay 1577a9fe9ddaSSatish Balay #undef __FUNCT__ 1578a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeNumeric_SeqDense_SeqDense" 1579a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1580a9fe9ddaSSatish Balay { 1581a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1582a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1583a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 1584899cda47SBarry Smith PetscBLASInt m=(PetscBLASInt)A->cmap.n,n=(PetscBLASInt)B->cmap.n,k=(PetscBLASInt)A->rmap.n; 1585a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1586a9fe9ddaSSatish Balay 1587a9fe9ddaSSatish Balay PetscFunctionBegin; 1588a9fe9ddaSSatish Balay BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1589a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1590a9fe9ddaSSatish Balay } 1591985db425SBarry Smith 1592985db425SBarry Smith #undef __FUNCT__ 1593985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense" 1594985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[]) 1595985db425SBarry Smith { 1596985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1597985db425SBarry Smith PetscErrorCode ierr; 1598985db425SBarry Smith PetscInt i,j,m = A->rmap.n,n = A->cmap.n,p; 1599985db425SBarry Smith PetscScalar *x; 1600985db425SBarry Smith MatScalar *aa = a->v; 1601985db425SBarry Smith 1602985db425SBarry Smith PetscFunctionBegin; 1603985db425SBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1604985db425SBarry Smith 1605985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1606985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1607985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1608985db425SBarry Smith if (p != A->rmap.n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1609985db425SBarry Smith for (i=0; i<m; i++) { 1610985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1611985db425SBarry Smith for (j=1; j<n; j++){ 1612985db425SBarry Smith if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1613985db425SBarry Smith } 1614985db425SBarry Smith } 1615985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1616985db425SBarry Smith PetscFunctionReturn(0); 1617985db425SBarry Smith } 1618985db425SBarry Smith 1619985db425SBarry Smith #undef __FUNCT__ 1620985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense" 1621985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[]) 1622985db425SBarry Smith { 1623985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1624985db425SBarry Smith PetscErrorCode ierr; 1625985db425SBarry Smith PetscInt i,j,m = A->rmap.n,n = A->cmap.n,p; 1626985db425SBarry Smith PetscScalar *x; 1627985db425SBarry Smith PetscReal atmp; 1628985db425SBarry Smith MatScalar *aa = a->v; 1629985db425SBarry Smith 1630985db425SBarry Smith PetscFunctionBegin; 1631985db425SBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1632985db425SBarry Smith 1633985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1634985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1635985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1636985db425SBarry Smith if (p != A->rmap.n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1637985db425SBarry Smith for (i=0; i<m; i++) { 1638985db425SBarry Smith x[i] = PetscAbsScalar(aa[i]); if (idx) idx[i] = 0; 1639985db425SBarry Smith for (j=1; j<n; j++){ 1640985db425SBarry Smith atmp = PetscAbsScalar(aa[i+m*j]); 1641985db425SBarry Smith if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;} 1642985db425SBarry Smith } 1643985db425SBarry Smith } 1644985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1645985db425SBarry Smith PetscFunctionReturn(0); 1646985db425SBarry Smith } 1647985db425SBarry Smith 1648985db425SBarry Smith #undef __FUNCT__ 1649985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense" 1650985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[]) 1651985db425SBarry Smith { 1652985db425SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1653985db425SBarry Smith PetscErrorCode ierr; 1654985db425SBarry Smith PetscInt i,j,m = A->rmap.n,n = A->cmap.n,p; 1655985db425SBarry Smith PetscScalar *x; 1656985db425SBarry Smith MatScalar *aa = a->v; 1657985db425SBarry Smith 1658985db425SBarry Smith PetscFunctionBegin; 1659985db425SBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 1660985db425SBarry Smith 1661985db425SBarry Smith ierr = VecSet(v,0.0);CHKERRQ(ierr); 1662985db425SBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1663985db425SBarry Smith ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr); 1664985db425SBarry Smith if (p != A->rmap.n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector"); 1665985db425SBarry Smith for (i=0; i<m; i++) { 1666985db425SBarry Smith x[i] = aa[i]; if (idx) idx[i] = 0; 1667985db425SBarry Smith for (j=1; j<n; j++){ 1668985db425SBarry Smith if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;} 1669985db425SBarry Smith } 1670985db425SBarry Smith } 1671985db425SBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 1672985db425SBarry Smith PetscFunctionReturn(0); 1673985db425SBarry Smith } 1674985db425SBarry Smith 16758d0534beSBarry Smith #undef __FUNCT__ 16768d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense" 16778d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col) 16788d0534beSBarry Smith { 16798d0534beSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 16808d0534beSBarry Smith PetscErrorCode ierr; 16818d0534beSBarry Smith PetscScalar *x; 16828d0534beSBarry Smith 16838d0534beSBarry Smith PetscFunctionBegin; 16848d0534beSBarry Smith if (A->factor) SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix"); 16858d0534beSBarry Smith 16868d0534beSBarry Smith ierr = VecGetArray(v,&x);CHKERRQ(ierr); 16878d0534beSBarry Smith ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 16888d0534beSBarry Smith ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 16898d0534beSBarry Smith PetscFunctionReturn(0); 16908d0534beSBarry Smith } 16918d0534beSBarry Smith 1692289bc588SBarry Smith /* -------------------------------------------------------------------*/ 1693a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense, 1694905e6a2fSBarry Smith MatGetRow_SeqDense, 1695905e6a2fSBarry Smith MatRestoreRow_SeqDense, 1696905e6a2fSBarry Smith MatMult_SeqDense, 169797304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 16987c922b88SBarry Smith MatMultTranspose_SeqDense, 16997c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 1700905e6a2fSBarry Smith MatSolve_SeqDense, 1701905e6a2fSBarry Smith MatSolveAdd_SeqDense, 17027c922b88SBarry Smith MatSolveTranspose_SeqDense, 170397304618SKris Buschelman /*10*/ MatSolveTransposeAdd_SeqDense, 1704905e6a2fSBarry Smith MatLUFactor_SeqDense, 1705905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 1706ec8511deSBarry Smith MatRelax_SeqDense, 1707ec8511deSBarry Smith MatTranspose_SeqDense, 170897304618SKris Buschelman /*15*/ MatGetInfo_SeqDense, 1709905e6a2fSBarry Smith MatEqual_SeqDense, 1710905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 1711905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 1712905e6a2fSBarry Smith MatNorm_SeqDense, 1713c0aa2d19SHong Zhang /*20*/ MatAssemblyBegin_SeqDense, 1714c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 1715905e6a2fSBarry Smith 0, 1716905e6a2fSBarry Smith MatSetOption_SeqDense, 1717905e6a2fSBarry Smith MatZeroEntries_SeqDense, 171897304618SKris Buschelman /*25*/ MatZeroRows_SeqDense, 1719905e6a2fSBarry Smith MatLUFactorSymbolic_SeqDense, 1720905e6a2fSBarry Smith MatLUFactorNumeric_SeqDense, 1721905e6a2fSBarry Smith MatCholeskyFactorSymbolic_SeqDense, 1722905e6a2fSBarry Smith MatCholeskyFactorNumeric_SeqDense, 172397304618SKris Buschelman /*30*/ MatSetUpPreallocation_SeqDense, 1724273d9f13SBarry Smith 0, 1725905e6a2fSBarry Smith 0, 1726905e6a2fSBarry Smith MatGetArray_SeqDense, 1727905e6a2fSBarry Smith MatRestoreArray_SeqDense, 172897304618SKris Buschelman /*35*/ MatDuplicate_SeqDense, 1729a5ae1ecdSBarry Smith 0, 1730a5ae1ecdSBarry Smith 0, 1731a5ae1ecdSBarry Smith 0, 1732a5ae1ecdSBarry Smith 0, 173397304618SKris Buschelman /*40*/ MatAXPY_SeqDense, 1734a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 1735a5ae1ecdSBarry Smith 0, 17364b0e389bSBarry Smith MatGetValues_SeqDense, 1737a5ae1ecdSBarry Smith MatCopy_SeqDense, 1738985db425SBarry Smith /*45*/ MatGetRowMax_SeqDense, 1739a5ae1ecdSBarry Smith MatScale_SeqDense, 1740a5ae1ecdSBarry Smith 0, 1741a5ae1ecdSBarry Smith 0, 1742a5ae1ecdSBarry Smith 0, 1743521d7252SBarry Smith /*50*/ 0, 1744a5ae1ecdSBarry Smith 0, 1745a5ae1ecdSBarry Smith 0, 1746a5ae1ecdSBarry Smith 0, 1747a5ae1ecdSBarry Smith 0, 174897304618SKris Buschelman /*55*/ 0, 1749a5ae1ecdSBarry Smith 0, 1750a5ae1ecdSBarry Smith 0, 1751a5ae1ecdSBarry Smith 0, 1752a5ae1ecdSBarry Smith 0, 175397304618SKris Buschelman /*60*/ 0, 1754e03a110bSBarry Smith MatDestroy_SeqDense, 1755e03a110bSBarry Smith MatView_SeqDense, 1756357abbc8SBarry Smith 0, 175797304618SKris Buschelman 0, 175897304618SKris Buschelman /*65*/ 0, 175997304618SKris Buschelman 0, 176097304618SKris Buschelman 0, 176197304618SKris Buschelman 0, 176297304618SKris Buschelman 0, 1763985db425SBarry Smith /*70*/ MatGetRowMaxAbs_SeqDense, 176497304618SKris Buschelman 0, 176597304618SKris Buschelman 0, 176697304618SKris Buschelman 0, 176797304618SKris Buschelman 0, 176897304618SKris Buschelman /*75*/ 0, 176997304618SKris Buschelman 0, 177097304618SKris Buschelman 0, 177197304618SKris Buschelman 0, 177297304618SKris Buschelman 0, 177397304618SKris Buschelman /*80*/ 0, 177497304618SKris Buschelman 0, 177597304618SKris Buschelman 0, 177697304618SKris Buschelman 0, 1777865e5f61SKris Buschelman /*84*/ MatLoad_SeqDense, 1778865e5f61SKris Buschelman 0, 17791cbb95d3SBarry Smith MatIsHermitian_SeqDense, 1780865e5f61SKris Buschelman 0, 1781865e5f61SKris Buschelman 0, 1782865e5f61SKris Buschelman 0, 1783a9fe9ddaSSatish Balay /*90*/ MatMatMult_SeqDense_SeqDense, 1784a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 1785a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 1786865e5f61SKris Buschelman 0, 1787865e5f61SKris Buschelman 0, 1788865e5f61SKris Buschelman /*95*/ 0, 1789a9fe9ddaSSatish Balay MatMatMultTranspose_SeqDense_SeqDense, 1790a9fe9ddaSSatish Balay MatMatMultTransposeSymbolic_SeqDense_SeqDense, 1791a9fe9ddaSSatish Balay MatMatMultTransposeNumeric_SeqDense_SeqDense, 1792284134d9SBarry Smith 0, 1793284134d9SBarry Smith /*100*/0, 1794284134d9SBarry Smith 0, 1795284134d9SBarry Smith 0, 1796284134d9SBarry Smith 0, 1797985db425SBarry Smith MatSetSizes_SeqDense, 1798985db425SBarry Smith 0, 1799985db425SBarry Smith 0, 1800985db425SBarry Smith 0, 1801985db425SBarry Smith 0, 1802985db425SBarry Smith 0, 1803985db425SBarry Smith /*110*/0, 1804985db425SBarry Smith 0, 18058d0534beSBarry Smith MatGetRowMin_SeqDense, 18068d0534beSBarry Smith MatGetColumnVector_SeqDense 1807985db425SBarry Smith }; 180890ace30eSBarry Smith 18094a2ae208SSatish Balay #undef __FUNCT__ 18104a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 18114b828684SBarry Smith /*@C 1812fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 1813d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 1814d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 1815289bc588SBarry Smith 1816db81eaa0SLois Curfman McInnes Collective on MPI_Comm 1817db81eaa0SLois Curfman McInnes 181820563c6bSBarry Smith Input Parameters: 1819db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 18200c775827SLois Curfman McInnes . m - number of rows 182118f449edSLois Curfman McInnes . n - number of columns 1822db81eaa0SLois Curfman McInnes - data - optional location of matrix data. Set data=PETSC_NULL for PETSc 1823dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 182420563c6bSBarry Smith 182520563c6bSBarry Smith Output Parameter: 182644cd7ae7SLois Curfman McInnes . A - the matrix 182720563c6bSBarry Smith 1828b259b22eSLois Curfman McInnes Notes: 182918f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 183018f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 1831b4fd4287SBarry Smith set data=PETSC_NULL. 183218f449edSLois Curfman McInnes 1833027ccd11SLois Curfman McInnes Level: intermediate 1834027ccd11SLois Curfman McInnes 1835dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 1836d65003e9SLois Curfman McInnes 1837db81eaa0SLois Curfman McInnes .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues() 183820563c6bSBarry Smith @*/ 1839be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 1840289bc588SBarry Smith { 1841dfbe8321SBarry Smith PetscErrorCode ierr; 18423b2fbd54SBarry Smith 18433a40ed3dSBarry Smith PetscFunctionBegin; 1844f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 1845f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 1846273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 1847273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 1848273d9f13SBarry Smith PetscFunctionReturn(0); 1849273d9f13SBarry Smith } 1850273d9f13SBarry Smith 18514a2ae208SSatish Balay #undef __FUNCT__ 1852afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation" 1853273d9f13SBarry Smith /*@C 1854273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 1855273d9f13SBarry Smith 1856273d9f13SBarry Smith Collective on MPI_Comm 1857273d9f13SBarry Smith 1858273d9f13SBarry Smith Input Parameters: 1859273d9f13SBarry Smith + A - the matrix 1860273d9f13SBarry Smith - data - the array (or PETSC_NULL) 1861273d9f13SBarry Smith 1862273d9f13SBarry Smith Notes: 1863273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 1864273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 1865284134d9SBarry Smith need not call this routine. 1866273d9f13SBarry Smith 1867273d9f13SBarry Smith Level: intermediate 1868273d9f13SBarry Smith 1869273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 1870273d9f13SBarry Smith 1871273d9f13SBarry Smith .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues() 1872273d9f13SBarry Smith @*/ 1873be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 1874273d9f13SBarry Smith { 1875dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(Mat,PetscScalar[]); 1876a23d5eceSKris Buschelman 1877a23d5eceSKris Buschelman PetscFunctionBegin; 1878a23d5eceSKris Buschelman ierr = PetscObjectQueryFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",(void (**)(void))&f);CHKERRQ(ierr); 1879a23d5eceSKris Buschelman if (f) { 1880a23d5eceSKris Buschelman ierr = (*f)(B,data);CHKERRQ(ierr); 1881a23d5eceSKris Buschelman } 1882a23d5eceSKris Buschelman PetscFunctionReturn(0); 1883a23d5eceSKris Buschelman } 1884a23d5eceSKris Buschelman 1885a23d5eceSKris Buschelman EXTERN_C_BEGIN 1886a23d5eceSKris Buschelman #undef __FUNCT__ 1887afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense" 1888be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 1889a23d5eceSKris Buschelman { 1890273d9f13SBarry Smith Mat_SeqDense *b; 1891dfbe8321SBarry Smith PetscErrorCode ierr; 1892273d9f13SBarry Smith 1893273d9f13SBarry Smith PetscFunctionBegin; 1894273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 1895273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 1896273d9f13SBarry Smith if (!data) { 1897284134d9SBarry Smith ierr = PetscMalloc((b->lda*b->Nmax+1)*sizeof(PetscScalar),&b->v);CHKERRQ(ierr); 1898284134d9SBarry Smith ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 1899273d9f13SBarry Smith b->user_alloc = PETSC_FALSE; 1900284134d9SBarry Smith ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 1901273d9f13SBarry Smith } else { /* user-allocated storage */ 1902273d9f13SBarry Smith b->v = data; 1903273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 1904273d9f13SBarry Smith } 1905273d9f13SBarry Smith PetscFunctionReturn(0); 1906273d9f13SBarry Smith } 1907a23d5eceSKris Buschelman EXTERN_C_END 1908273d9f13SBarry Smith 19091b807ce4Svictorle #undef __FUNCT__ 19101b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 19111b807ce4Svictorle /*@C 19121b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 19131b807ce4Svictorle 19141b807ce4Svictorle Input parameter: 19151b807ce4Svictorle + A - the matrix 19161b807ce4Svictorle - lda - the leading dimension 19171b807ce4Svictorle 19181b807ce4Svictorle Notes: 19191b807ce4Svictorle This routine is to be used in conjunction with MatSeqDenseSetPreallocation; 19201b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 19211b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 19221b807ce4Svictorle 19231b807ce4Svictorle Level: intermediate 19241b807ce4Svictorle 19251b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 19261b807ce4Svictorle 1927284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 19281b807ce4Svictorle @*/ 1929be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetLDA(Mat B,PetscInt lda) 19301b807ce4Svictorle { 19311b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 193221a2c019SBarry Smith 19331b807ce4Svictorle PetscFunctionBegin; 1934899cda47SBarry Smith if (lda < B->rmap.n) SETERRQ2(PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->rmap.n); 19351b807ce4Svictorle b->lda = lda; 193621a2c019SBarry Smith b->changelda = PETSC_FALSE; 193721a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 19381b807ce4Svictorle PetscFunctionReturn(0); 19391b807ce4Svictorle } 19401b807ce4Svictorle 19410bad9183SKris Buschelman /*MC 1942fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 19430bad9183SKris Buschelman 19440bad9183SKris Buschelman Options Database Keys: 19450bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 19460bad9183SKris Buschelman 19470bad9183SKris Buschelman Level: beginner 19480bad9183SKris Buschelman 194989665df3SBarry Smith .seealso: MatCreateSeqDense() 195089665df3SBarry Smith 19510bad9183SKris Buschelman M*/ 19520bad9183SKris Buschelman 1953273d9f13SBarry Smith EXTERN_C_BEGIN 19544a2ae208SSatish Balay #undef __FUNCT__ 19554a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 1956be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreate_SeqDense(Mat B) 1957273d9f13SBarry Smith { 1958273d9f13SBarry Smith Mat_SeqDense *b; 1959dfbe8321SBarry Smith PetscErrorCode ierr; 19607c334f02SBarry Smith PetscMPIInt size; 1961273d9f13SBarry Smith 1962273d9f13SBarry Smith PetscFunctionBegin; 1963273d9f13SBarry Smith ierr = MPI_Comm_size(B->comm,&size);CHKERRQ(ierr); 196429bbc08cSBarry Smith if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 196555659b69SBarry Smith 1966899cda47SBarry Smith B->rmap.bs = B->cmap.bs = 1; 19676148ca0dSBarry Smith ierr = PetscMapSetUp(&B->rmap);CHKERRQ(ierr); 19686148ca0dSBarry Smith ierr = PetscMapSetUp(&B->cmap);CHKERRQ(ierr); 1969273d9f13SBarry Smith 1970*38f2d2fdSLisandro Dalcin ierr = PetscNewLog(B,Mat_SeqDense,&b);CHKERRQ(ierr); 1971549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 197244cd7ae7SLois Curfman McInnes B->factor = 0; 197390f02eecSBarry Smith B->mapping = 0; 197444cd7ae7SLois Curfman McInnes B->data = (void*)b; 197518f449edSLois Curfman McInnes 1976a5ae1ecdSBarry Smith 197744cd7ae7SLois Curfman McInnes b->pivots = 0; 1978273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 1979273d9f13SBarry Smith b->v = 0; 1980899cda47SBarry Smith b->lda = B->rmap.n; 198121a2c019SBarry Smith b->changelda = PETSC_FALSE; 1982899cda47SBarry Smith b->Mmax = B->rmap.n; 1983899cda47SBarry Smith b->Nmax = B->cmap.n; 19844e220ebcSLois Curfman McInnes 1985a23d5eceSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C", 1986a23d5eceSKris Buschelman "MatSeqDenseSetPreallocation_SeqDense", 1987a23d5eceSKris Buschelman MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 19884ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMult_seqaij_seqdense_C", 19894ae313f4SHong Zhang "MatMatMult_SeqAIJ_SeqDense", 19904ae313f4SHong Zhang MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr); 19914ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C", 19924ae313f4SHong Zhang "MatMatMultSymbolic_SeqAIJ_SeqDense", 19934ae313f4SHong Zhang MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr); 19944ae313f4SHong Zhang ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C", 19954ae313f4SHong Zhang "MatMatMultNumeric_SeqAIJ_SeqDense", 19964ae313f4SHong Zhang MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr); 199717667f90SBarry Smith ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr); 19983a40ed3dSBarry Smith PetscFunctionReturn(0); 1999289bc588SBarry Smith } 2000c0aa2d19SHong Zhang 2001c0aa2d19SHong Zhang 2002273d9f13SBarry Smith EXTERN_C_END 2003