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 79289bc588SBarry Smith /* ---------------------------------------------------------------*/ 806831982aSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 816831982aSBarry Smith rather than put it in the Mat->row slot.*/ 824a2ae208SSatish Balay #undef __FUNCT__ 834a2ae208SSatish Balay #define __FUNCT__ "MatLUFactor_SeqDense" 84dfbe8321SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,MatFactorInfo *minfo) 85289bc588SBarry Smith { 86a07ab388SBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 8781f479a6Svictorle PetscFunctionBegin; 88a07ab388SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 89a07ab388SBarry Smith #else 90c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 916849ba73SBarry Smith PetscErrorCode ierr; 92899cda47SBarry Smith PetscBLASInt n = (PetscBLASInt)A->cmap.n,m = (PetscBLASInt)A->rmap.n,info; 9355659b69SBarry Smith 943a40ed3dSBarry Smith PetscFunctionBegin; 95289bc588SBarry Smith if (!mat->pivots) { 96899cda47SBarry Smith ierr = PetscMalloc((A->rmap.n+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr); 97899cda47SBarry Smith ierr = PetscLogObjectMemory(A,A->rmap.n*sizeof(PetscBLASInt));CHKERRQ(ierr); 98289bc588SBarry Smith } 99f1af5d2fSBarry Smith A->factor = FACTOR_LU; 100899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 10171044d3cSBarry Smith LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info); 10229bbc08cSBarry Smith if (info<0) SETERRQ(PETSC_ERR_LIB,"Bad argument to LU factorization"); 10329bbc08cSBarry Smith if (info>0) SETERRQ(PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 104899cda47SBarry Smith ierr = PetscLogFlops((2*A->cmap.n*A->cmap.n*A->cmap.n)/3);CHKERRQ(ierr); 105a07ab388SBarry Smith #endif 1063a40ed3dSBarry Smith PetscFunctionReturn(0); 107289bc588SBarry Smith } 1086ee01492SSatish Balay 1094a2ae208SSatish Balay #undef __FUNCT__ 1104a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense" 111dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 11202cad45dSBarry Smith { 11302cad45dSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 1146849ba73SBarry Smith PetscErrorCode ierr; 11513f74950SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 11602cad45dSBarry Smith Mat newi; 11702cad45dSBarry Smith 1183a40ed3dSBarry Smith PetscFunctionBegin; 119f69a0ea3SMatthew Knepley ierr = MatCreate(A->comm,&newi);CHKERRQ(ierr); 120899cda47SBarry Smith ierr = MatSetSizes(newi,A->rmap.n,A->cmap.n,A->rmap.n,A->cmap.n);CHKERRQ(ierr); 1215c5985e7SKris Buschelman ierr = MatSetType(newi,A->type_name);CHKERRQ(ierr); 1225c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(newi,PETSC_NULL);CHKERRQ(ierr); 1235609ef8eSBarry Smith if (cpvalues == MAT_COPY_VALUES) { 124a5ce6ee0Svictorle l = (Mat_SeqDense*)newi->data; 125899cda47SBarry Smith if (lda>A->rmap.n) { 126899cda47SBarry Smith m = A->rmap.n; 127899cda47SBarry Smith for (j=0; j<A->cmap.n; j++) { 128a5ce6ee0Svictorle ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 129a5ce6ee0Svictorle } 130a5ce6ee0Svictorle } else { 131899cda47SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap.n*A->cmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 13202cad45dSBarry Smith } 133a5ce6ee0Svictorle } 13402cad45dSBarry Smith newi->assembled = PETSC_TRUE; 13502cad45dSBarry Smith *newmat = newi; 1363a40ed3dSBarry Smith PetscFunctionReturn(0); 13702cad45dSBarry Smith } 13802cad45dSBarry Smith 1394a2ae208SSatish Balay #undef __FUNCT__ 1404a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorSymbolic_SeqDense" 141dfbe8321SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat A,IS row,IS col,MatFactorInfo *info,Mat *fact) 142289bc588SBarry Smith { 143dfbe8321SBarry Smith PetscErrorCode ierr; 1443a40ed3dSBarry Smith 1453a40ed3dSBarry Smith PetscFunctionBegin; 1465609ef8eSBarry Smith ierr = MatDuplicate_SeqDense(A,MAT_DO_NOT_COPY_VALUES,fact);CHKERRQ(ierr); 1473a40ed3dSBarry Smith PetscFunctionReturn(0); 148289bc588SBarry Smith } 1496ee01492SSatish Balay 1504a2ae208SSatish Balay #undef __FUNCT__ 1514a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense" 152af281ebdSHong Zhang PetscErrorCode MatLUFactorNumeric_SeqDense(Mat A,MatFactorInfo *info_dummy,Mat *fact) 153289bc588SBarry Smith { 15402cad45dSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l = (Mat_SeqDense*)(*fact)->data; 1556849ba73SBarry Smith PetscErrorCode ierr; 156899cda47SBarry Smith PetscInt lda1=mat->lda,lda2=l->lda, m=A->rmap.n,n=A->cmap.n, j; 1574482741eSBarry Smith MatFactorInfo info; 1583a40ed3dSBarry Smith 1593a40ed3dSBarry Smith PetscFunctionBegin; 16002cad45dSBarry Smith /* copy the numerical values */ 1611b807ce4Svictorle if (lda1>m || lda2>m ) { 1621b807ce4Svictorle for (j=0; j<n; j++) { 1631b807ce4Svictorle ierr = PetscMemcpy(l->v+j*lda2,mat->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1641b807ce4Svictorle } 1651b807ce4Svictorle } else { 166899cda47SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->rmap.n*A->cmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 1671b807ce4Svictorle } 16802cad45dSBarry Smith (*fact)->factor = 0; 1694482741eSBarry Smith ierr = MatLUFactor(*fact,0,0,&info);CHKERRQ(ierr); 1703a40ed3dSBarry Smith PetscFunctionReturn(0); 171289bc588SBarry Smith } 1726ee01492SSatish Balay 1734a2ae208SSatish Balay #undef __FUNCT__ 1744a2ae208SSatish Balay #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense" 175dfbe8321SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat A,IS row,MatFactorInfo *info,Mat *fact) 176289bc588SBarry Smith { 177dfbe8321SBarry Smith PetscErrorCode ierr; 1783a40ed3dSBarry Smith 1793a40ed3dSBarry Smith PetscFunctionBegin; 180ceb03754SKris Buschelman ierr = MatConvert(A,MATSAME,MAT_INITIAL_MATRIX,fact);CHKERRQ(ierr); 1813a40ed3dSBarry Smith PetscFunctionReturn(0); 182289bc588SBarry Smith } 1836ee01492SSatish Balay 1844a2ae208SSatish Balay #undef __FUNCT__ 1854a2ae208SSatish Balay #define __FUNCT__ "MatCholeskyFactor_SeqDense" 186dfbe8321SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,MatFactorInfo *factinfo) 187289bc588SBarry Smith { 188a07ab388SBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 189a07ab388SBarry Smith PetscFunctionBegin; 190a07ab388SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 191a07ab388SBarry Smith #else 192c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1936849ba73SBarry Smith PetscErrorCode ierr; 194899cda47SBarry Smith PetscBLASInt n = (PetscBLASInt)A->cmap.n,info; 19555659b69SBarry Smith 1963a40ed3dSBarry Smith PetscFunctionBegin; 197606d414cSSatish Balay ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 198752f5567SLois Curfman McInnes mat->pivots = 0; 19905b42c5fSBarry Smith 200899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 20171044d3cSBarry Smith LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info); 20277431f27SBarry Smith if (info) SETERRQ1(PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 203c0bbcb79SLois Curfman McInnes A->factor = FACTOR_CHOLESKY; 204899cda47SBarry Smith ierr = PetscLogFlops((A->cmap.n*A->cmap.n*A->cmap.n)/3);CHKERRQ(ierr); 205a07ab388SBarry Smith #endif 2063a40ed3dSBarry Smith PetscFunctionReturn(0); 207289bc588SBarry Smith } 208289bc588SBarry Smith 2094a2ae208SSatish Balay #undef __FUNCT__ 2100b4b3355SBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense" 211af281ebdSHong Zhang PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat A,MatFactorInfo *info_dummy,Mat *fact) 2120b4b3355SBarry Smith { 213dfbe8321SBarry Smith PetscErrorCode ierr; 21415e8a5b3SHong Zhang MatFactorInfo info; 2150b4b3355SBarry Smith 2160b4b3355SBarry Smith PetscFunctionBegin; 21715e8a5b3SHong Zhang info.fill = 1.0; 21815e8a5b3SHong Zhang ierr = MatCholeskyFactor_SeqDense(*fact,0,&info);CHKERRQ(ierr); 2190b4b3355SBarry Smith PetscFunctionReturn(0); 2200b4b3355SBarry Smith } 2210b4b3355SBarry Smith 2220b4b3355SBarry Smith #undef __FUNCT__ 2234a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense" 224dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 225289bc588SBarry Smith { 226c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 2276849ba73SBarry Smith PetscErrorCode ierr; 228899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt)A->rmap.n, one = 1,info; 22987828ca2SBarry Smith PetscScalar *x,*y; 23067e560aaSBarry Smith 2313a40ed3dSBarry Smith PetscFunctionBegin; 2321ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2331ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 234899cda47SBarry Smith ierr = PetscMemcpy(y,x,A->rmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 235c0bbcb79SLois Curfman McInnes if (A->factor == FACTOR_LU) { 236ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 23780444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 238ae7cfcebSSatish Balay #else 23971044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 2404ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"GETRS - Bad solve"); 241ae7cfcebSSatish Balay #endif 2427a97a34bSBarry Smith } else if (A->factor == FACTOR_CHOLESKY){ 243ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 24480444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 245ae7cfcebSSatish Balay #else 24671044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 2474ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS Bad solve"); 248ae7cfcebSSatish Balay #endif 249289bc588SBarry Smith } 25029bbc08cSBarry Smith else SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 2511ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2521ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 253899cda47SBarry Smith ierr = PetscLogFlops(2*A->cmap.n*A->cmap.n - A->cmap.n);CHKERRQ(ierr); 2543a40ed3dSBarry Smith PetscFunctionReturn(0); 255289bc588SBarry Smith } 2566ee01492SSatish Balay 2574a2ae208SSatish Balay #undef __FUNCT__ 2584a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense" 259dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 260da3a660dSBarry Smith { 261c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 262dfbe8321SBarry Smith PetscErrorCode ierr; 263899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt) A->rmap.n,one = 1,info; 26487828ca2SBarry Smith PetscScalar *x,*y; 26567e560aaSBarry Smith 2663a40ed3dSBarry Smith PetscFunctionBegin; 2671ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2681ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 269899cda47SBarry Smith ierr = PetscMemcpy(y,x,A->rmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 270752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 271da3a660dSBarry Smith if (mat->pivots) { 272ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 27380444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 274ae7cfcebSSatish Balay #else 27571044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 2764ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS - Bad solve"); 277ae7cfcebSSatish Balay #endif 2787a97a34bSBarry Smith } else { 279ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 28080444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 281ae7cfcebSSatish Balay #else 28271044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 2834ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS - Bad solve"); 284ae7cfcebSSatish Balay #endif 285da3a660dSBarry Smith } 2861ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2871ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 288899cda47SBarry Smith ierr = PetscLogFlops(2*A->cmap.n*A->cmap.n - A->cmap.n);CHKERRQ(ierr); 2893a40ed3dSBarry Smith PetscFunctionReturn(0); 290da3a660dSBarry Smith } 2916ee01492SSatish Balay 2924a2ae208SSatish Balay #undef __FUNCT__ 2934a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense" 294dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 295da3a660dSBarry Smith { 296c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 297dfbe8321SBarry Smith PetscErrorCode ierr; 298899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt)A->rmap.n,one = 1,info; 29987828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 300da3a660dSBarry Smith Vec tmp = 0; 30167e560aaSBarry Smith 3023a40ed3dSBarry Smith PetscFunctionBegin; 3031ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 3041ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 305899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 306da3a660dSBarry Smith if (yy == zz) { 30778b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 30852e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 30978b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 310da3a660dSBarry Smith } 311899cda47SBarry Smith ierr = PetscMemcpy(y,x,A->rmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 312752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 313da3a660dSBarry Smith if (mat->pivots) { 314ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 31580444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 316ae7cfcebSSatish Balay #else 31771044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 3182ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 319ae7cfcebSSatish Balay #endif 320a8c6a408SBarry Smith } else { 321ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 32280444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 323ae7cfcebSSatish Balay #else 32471044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 3252ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 326ae7cfcebSSatish Balay #endif 327da3a660dSBarry Smith } 3282dcb1b2aSMatthew Knepley if (tmp) {ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); ierr = VecDestroy(tmp);CHKERRQ(ierr);} 3292dcb1b2aSMatthew Knepley else {ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);} 3301ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3311ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 332899cda47SBarry Smith ierr = PetscLogFlops(2*A->cmap.n*A->cmap.n);CHKERRQ(ierr); 3333a40ed3dSBarry Smith PetscFunctionReturn(0); 334da3a660dSBarry Smith } 33567e560aaSBarry Smith 3364a2ae208SSatish Balay #undef __FUNCT__ 3374a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense" 338dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 339da3a660dSBarry Smith { 340c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 3416849ba73SBarry Smith PetscErrorCode ierr; 342899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt)A->rmap.n,one = 1,info; 34387828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 344da3a660dSBarry Smith Vec tmp; 34567e560aaSBarry Smith 3463a40ed3dSBarry Smith PetscFunctionBegin; 347899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 3481ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 3491ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 350da3a660dSBarry Smith if (yy == zz) { 35178b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 35252e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 35378b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 354da3a660dSBarry Smith } 355899cda47SBarry Smith ierr = PetscMemcpy(y,x,A->rmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 356752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 357da3a660dSBarry Smith if (mat->pivots) { 358ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 35980444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 360ae7cfcebSSatish Balay #else 36171044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 3622ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 363ae7cfcebSSatish Balay #endif 3643a40ed3dSBarry Smith } else { 365ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 36680444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 367ae7cfcebSSatish Balay #else 36871044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 3692ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 370ae7cfcebSSatish Balay #endif 371da3a660dSBarry Smith } 37290f02eecSBarry Smith if (tmp) { 3732dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 37490f02eecSBarry Smith ierr = VecDestroy(tmp);CHKERRQ(ierr); 3753a40ed3dSBarry Smith } else { 3762dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 37790f02eecSBarry Smith } 3781ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3791ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 380899cda47SBarry Smith ierr = PetscLogFlops(2*A->cmap.n*A->cmap.n);CHKERRQ(ierr); 3813a40ed3dSBarry Smith PetscFunctionReturn(0); 382da3a660dSBarry Smith } 383289bc588SBarry Smith /* ------------------------------------------------------------------*/ 3844a2ae208SSatish Balay #undef __FUNCT__ 3854a2ae208SSatish Balay #define __FUNCT__ "MatRelax_SeqDense" 38613f74950SBarry Smith PetscErrorCode MatRelax_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 387289bc588SBarry Smith { 388c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 38987828ca2SBarry Smith PetscScalar *x,*b,*v = mat->v,zero = 0.0,xt; 390dfbe8321SBarry Smith PetscErrorCode ierr; 391899cda47SBarry Smith PetscInt m = A->rmap.n,i; 392aa482453SBarry Smith #if !defined(PETSC_USE_COMPLEX) 3934ce68768SBarry Smith PetscBLASInt bm = (PetscBLASInt)m, o = 1; 394bc1b551cSSatish Balay #endif 395289bc588SBarry Smith 3963a40ed3dSBarry Smith PetscFunctionBegin; 397289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 39871044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 3992dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 400289bc588SBarry Smith } 4011ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 4021ebc52fbSHong Zhang ierr = VecGetArray(bb,&b);CHKERRQ(ierr); 403b965ef7fSBarry Smith its = its*lits; 40477431f27SBarry Smith if (its <= 0) SETERRQ2(PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits); 405289bc588SBarry Smith while (its--) { 406fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){ 407289bc588SBarry Smith for (i=0; i<m; i++) { 408aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 409f1747703SBarry Smith /* cannot use BLAS dot for complex because compiler/linker is 410f1747703SBarry Smith not happy about returning a double complex */ 41113f74950SBarry Smith PetscInt _i; 41287828ca2SBarry Smith PetscScalar sum = b[i]; 413f1747703SBarry Smith for (_i=0; _i<m; _i++) { 4143f6de6efSSatish Balay sum -= PetscConj(v[i+_i*m])*x[_i]; 415f1747703SBarry Smith } 416f1747703SBarry Smith xt = sum; 417f1747703SBarry Smith #else 41871044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 419f1747703SBarry Smith #endif 42055a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 421289bc588SBarry Smith } 422289bc588SBarry Smith } 423fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){ 424289bc588SBarry Smith for (i=m-1; i>=0; i--) { 425aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 426f1747703SBarry Smith /* cannot use BLAS dot for complex because compiler/linker is 427f1747703SBarry Smith not happy about returning a double complex */ 42813f74950SBarry Smith PetscInt _i; 42987828ca2SBarry Smith PetscScalar sum = b[i]; 430f1747703SBarry Smith for (_i=0; _i<m; _i++) { 4313f6de6efSSatish Balay sum -= PetscConj(v[i+_i*m])*x[_i]; 432f1747703SBarry Smith } 433f1747703SBarry Smith xt = sum; 434f1747703SBarry Smith #else 43571044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 436f1747703SBarry Smith #endif 43755a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 438289bc588SBarry Smith } 439289bc588SBarry Smith } 440289bc588SBarry Smith } 4411ebc52fbSHong Zhang ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr); 4421ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 4433a40ed3dSBarry Smith PetscFunctionReturn(0); 444289bc588SBarry Smith } 445289bc588SBarry Smith 446289bc588SBarry Smith /* -----------------------------------------------------------------*/ 4474a2ae208SSatish Balay #undef __FUNCT__ 4484a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense" 449dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 450289bc588SBarry Smith { 451c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 45287828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 453dfbe8321SBarry Smith PetscErrorCode ierr; 454899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt)A->rmap.n, n = (PetscBLASInt)A->cmap.n,_One=1; 455ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 4563a40ed3dSBarry Smith 4573a40ed3dSBarry Smith PetscFunctionBegin; 458899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 4591ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 4601ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 46171044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One); 4621ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 4631ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 464899cda47SBarry Smith ierr = PetscLogFlops(2*A->rmap.n*A->cmap.n - A->cmap.n);CHKERRQ(ierr); 4653a40ed3dSBarry Smith PetscFunctionReturn(0); 466289bc588SBarry Smith } 4676ee01492SSatish Balay 4684a2ae208SSatish Balay #undef __FUNCT__ 4694a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense" 470dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 471289bc588SBarry Smith { 472c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 47387828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0; 474dfbe8321SBarry Smith PetscErrorCode ierr; 475899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt)A->rmap.n, n = (PetscBLASInt)A->cmap.n, _One=1; 4763a40ed3dSBarry Smith 4773a40ed3dSBarry Smith PetscFunctionBegin; 478899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 4791ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 4801ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 48171044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One); 4821ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 4831ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 484899cda47SBarry Smith ierr = PetscLogFlops(2*A->rmap.n*A->cmap.n - A->rmap.n);CHKERRQ(ierr); 4853a40ed3dSBarry Smith PetscFunctionReturn(0); 486289bc588SBarry Smith } 4876ee01492SSatish Balay 4884a2ae208SSatish Balay #undef __FUNCT__ 4894a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense" 490dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 491289bc588SBarry Smith { 492c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 49387828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0; 494dfbe8321SBarry Smith PetscErrorCode ierr; 495899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt)A->rmap.n, n = (PetscBLASInt)A->cmap.n, _One=1; 4963a40ed3dSBarry Smith 4973a40ed3dSBarry Smith PetscFunctionBegin; 498899cda47SBarry Smith if (!A->rmap.n || !A->cmap.n) PetscFunctionReturn(0); 499600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 5001ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5011ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 50271044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 5031ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5041ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 505899cda47SBarry Smith ierr = PetscLogFlops(2*A->rmap.n*A->cmap.n);CHKERRQ(ierr); 5063a40ed3dSBarry Smith PetscFunctionReturn(0); 507289bc588SBarry Smith } 5086ee01492SSatish Balay 5094a2ae208SSatish Balay #undef __FUNCT__ 5104a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense" 511dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 512289bc588SBarry Smith { 513c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 51487828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 515dfbe8321SBarry Smith PetscErrorCode ierr; 516899cda47SBarry Smith PetscBLASInt m = (PetscBLASInt)A->rmap.n, n = (PetscBLASInt)A->cmap.n, _One=1; 51787828ca2SBarry Smith PetscScalar _DOne=1.0; 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_("T",&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 } 530289bc588SBarry Smith 531289bc588SBarry Smith /* -----------------------------------------------------------------*/ 5324a2ae208SSatish Balay #undef __FUNCT__ 5334a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense" 53413f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 535289bc588SBarry Smith { 536c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 53787828ca2SBarry Smith PetscScalar *v; 5386849ba73SBarry Smith PetscErrorCode ierr; 53913f74950SBarry Smith PetscInt i; 54067e560aaSBarry Smith 5413a40ed3dSBarry Smith PetscFunctionBegin; 542899cda47SBarry Smith *ncols = A->cmap.n; 543289bc588SBarry Smith if (cols) { 544899cda47SBarry Smith ierr = PetscMalloc((A->cmap.n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr); 545899cda47SBarry Smith for (i=0; i<A->cmap.n; i++) (*cols)[i] = i; 546289bc588SBarry Smith } 547289bc588SBarry Smith if (vals) { 548899cda47SBarry Smith ierr = PetscMalloc((A->cmap.n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr); 549289bc588SBarry Smith v = mat->v + row; 550899cda47SBarry Smith for (i=0; i<A->cmap.n; i++) {(*vals)[i] = *v; v += mat->lda;} 551289bc588SBarry Smith } 5523a40ed3dSBarry Smith PetscFunctionReturn(0); 553289bc588SBarry Smith } 5546ee01492SSatish Balay 5554a2ae208SSatish Balay #undef __FUNCT__ 5564a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense" 55713f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 558289bc588SBarry Smith { 559dfbe8321SBarry Smith PetscErrorCode ierr; 560606d414cSSatish Balay PetscFunctionBegin; 561606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 562606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 5633a40ed3dSBarry Smith PetscFunctionReturn(0); 564289bc588SBarry Smith } 565289bc588SBarry Smith /* ----------------------------------------------------------------*/ 5664a2ae208SSatish Balay #undef __FUNCT__ 5674a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense" 56813f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 569289bc588SBarry Smith { 570c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 57113f74950SBarry Smith PetscInt i,j,idx=0; 572d6dfbf8fSBarry Smith 5733a40ed3dSBarry Smith PetscFunctionBegin; 574289bc588SBarry Smith if (!mat->roworiented) { 575dbb450caSBarry Smith if (addv == INSERT_VALUES) { 576289bc588SBarry Smith for (j=0; j<n; j++) { 577cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 5782515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 579899cda47SBarry 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); 58058804f6dSBarry Smith #endif 581289bc588SBarry Smith for (i=0; i<m; i++) { 582cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 5832515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 584899cda47SBarry 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); 58558804f6dSBarry Smith #endif 586cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 587289bc588SBarry Smith } 588289bc588SBarry Smith } 5893a40ed3dSBarry Smith } else { 590289bc588SBarry Smith for (j=0; j<n; j++) { 591cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 5922515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 593899cda47SBarry 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); 59458804f6dSBarry Smith #endif 595289bc588SBarry Smith for (i=0; i<m; i++) { 596cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 5972515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 598899cda47SBarry 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); 59958804f6dSBarry Smith #endif 600cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 601289bc588SBarry Smith } 602289bc588SBarry Smith } 603289bc588SBarry Smith } 6043a40ed3dSBarry Smith } else { 605dbb450caSBarry Smith if (addv == INSERT_VALUES) { 606e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 607cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 6082515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 609899cda47SBarry 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); 61058804f6dSBarry Smith #endif 611e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 612cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 6132515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 614899cda47SBarry 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); 61558804f6dSBarry Smith #endif 616cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 617e8d4e0b9SBarry Smith } 618e8d4e0b9SBarry Smith } 6193a40ed3dSBarry Smith } else { 620289bc588SBarry Smith for (i=0; i<m; i++) { 621cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 6222515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 623899cda47SBarry 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); 62458804f6dSBarry Smith #endif 625289bc588SBarry Smith for (j=0; j<n; j++) { 626cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 6272515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 628899cda47SBarry 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); 62958804f6dSBarry Smith #endif 630cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 631289bc588SBarry Smith } 632289bc588SBarry Smith } 633289bc588SBarry Smith } 634e8d4e0b9SBarry Smith } 6353a40ed3dSBarry Smith PetscFunctionReturn(0); 636289bc588SBarry Smith } 637e8d4e0b9SBarry Smith 6384a2ae208SSatish Balay #undef __FUNCT__ 6394a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense" 64013f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 641ae80bb75SLois Curfman McInnes { 642ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 64313f74950SBarry Smith PetscInt i,j; 64487828ca2SBarry Smith PetscScalar *vpt = v; 645ae80bb75SLois Curfman McInnes 6463a40ed3dSBarry Smith PetscFunctionBegin; 647ae80bb75SLois Curfman McInnes /* row-oriented output */ 648ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 649ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 6501b807ce4Svictorle *vpt++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 651ae80bb75SLois Curfman McInnes } 652ae80bb75SLois Curfman McInnes } 6533a40ed3dSBarry Smith PetscFunctionReturn(0); 654ae80bb75SLois Curfman McInnes } 655ae80bb75SLois Curfman McInnes 656289bc588SBarry Smith /* -----------------------------------------------------------------*/ 657289bc588SBarry Smith 658e090d566SSatish Balay #include "petscsys.h" 65988e32edaSLois Curfman McInnes 6604a2ae208SSatish Balay #undef __FUNCT__ 6614a2ae208SSatish Balay #define __FUNCT__ "MatLoad_SeqDense" 662f69a0ea3SMatthew Knepley PetscErrorCode MatLoad_SeqDense(PetscViewer viewer, MatType type,Mat *A) 66388e32edaSLois Curfman McInnes { 66488e32edaSLois Curfman McInnes Mat_SeqDense *a; 66588e32edaSLois Curfman McInnes Mat B; 6666849ba73SBarry Smith PetscErrorCode ierr; 66713f74950SBarry Smith PetscInt *scols,i,j,nz,header[4]; 66813f74950SBarry Smith int fd; 66913f74950SBarry Smith PetscMPIInt size; 67013f74950SBarry Smith PetscInt *rowlengths = 0,M,N,*cols; 67187828ca2SBarry Smith PetscScalar *vals,*svals,*v,*w; 67219bcc07fSBarry Smith MPI_Comm comm = ((PetscObject)viewer)->comm; 67388e32edaSLois Curfman McInnes 6743a40ed3dSBarry Smith PetscFunctionBegin; 675d132466eSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 67629bbc08cSBarry Smith if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"view must have one processor"); 677b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 6780752156aSBarry Smith ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 679552e946dSBarry Smith if (header[0] != MAT_FILE_COOKIE) SETERRQ(PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 68088e32edaSLois Curfman McInnes M = header[1]; N = header[2]; nz = header[3]; 68188e32edaSLois Curfman McInnes 68290ace30eSBarry Smith if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 683f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 684f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,M,N,M,N);CHKERRQ(ierr); 685be5d1d56SKris Buschelman ierr = MatSetType(*A,type);CHKERRQ(ierr); 6865c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(*A,PETSC_NULL);CHKERRQ(ierr); 68790ace30eSBarry Smith B = *A; 68890ace30eSBarry Smith a = (Mat_SeqDense*)B->data; 6894a41a4d3SSatish Balay v = a->v; 6904a41a4d3SSatish Balay /* Allocate some temp space to read in the values and then flip them 6914a41a4d3SSatish Balay from row major to column major */ 692b72907f3SBarry Smith ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr); 69390ace30eSBarry Smith /* read in nonzero values */ 6944a41a4d3SSatish Balay ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 6954a41a4d3SSatish Balay /* now flip the values and store them in the matrix*/ 6964a41a4d3SSatish Balay for (j=0; j<N; j++) { 6974a41a4d3SSatish Balay for (i=0; i<M; i++) { 6984a41a4d3SSatish Balay *v++ =w[i*N+j]; 6994a41a4d3SSatish Balay } 7004a41a4d3SSatish Balay } 701606d414cSSatish Balay ierr = PetscFree(w);CHKERRQ(ierr); 7026d4a8577SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 7036d4a8577SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 70490ace30eSBarry Smith } else { 70588e32edaSLois Curfman McInnes /* read row lengths */ 70613f74950SBarry Smith ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr); 7070752156aSBarry Smith ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 70888e32edaSLois Curfman McInnes 70988e32edaSLois Curfman McInnes /* create our matrix */ 710f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 711f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,M,N,M,N);CHKERRQ(ierr); 712be5d1d56SKris Buschelman ierr = MatSetType(*A,type);CHKERRQ(ierr); 7135c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(*A,PETSC_NULL);CHKERRQ(ierr); 71488e32edaSLois Curfman McInnes B = *A; 71588e32edaSLois Curfman McInnes a = (Mat_SeqDense*)B->data; 71688e32edaSLois Curfman McInnes v = a->v; 71788e32edaSLois Curfman McInnes 71888e32edaSLois Curfman McInnes /* read column indices and nonzeros */ 71913f74950SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr); 720b0a32e0cSBarry Smith cols = scols; 7210752156aSBarry Smith ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 72287828ca2SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr); 723b0a32e0cSBarry Smith vals = svals; 7240752156aSBarry Smith ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 72588e32edaSLois Curfman McInnes 72688e32edaSLois Curfman McInnes /* insert into matrix */ 72788e32edaSLois Curfman McInnes for (i=0; i<M; i++) { 72888e32edaSLois Curfman McInnes for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 72988e32edaSLois Curfman McInnes svals += rowlengths[i]; scols += rowlengths[i]; 73088e32edaSLois Curfman McInnes } 731606d414cSSatish Balay ierr = PetscFree(vals);CHKERRQ(ierr); 732606d414cSSatish Balay ierr = PetscFree(cols);CHKERRQ(ierr); 733606d414cSSatish Balay ierr = PetscFree(rowlengths);CHKERRQ(ierr); 73488e32edaSLois Curfman McInnes 7356d4a8577SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 7366d4a8577SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 73790ace30eSBarry Smith } 7383a40ed3dSBarry Smith PetscFunctionReturn(0); 73988e32edaSLois Curfman McInnes } 74088e32edaSLois Curfman McInnes 741e090d566SSatish Balay #include "petscsys.h" 742932b0c3eSLois Curfman McInnes 7434a2ae208SSatish Balay #undef __FUNCT__ 7444a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII" 7456849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 746289bc588SBarry Smith { 747932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 748dfbe8321SBarry Smith PetscErrorCode ierr; 74913f74950SBarry Smith PetscInt i,j; 7502dcb1b2aSMatthew Knepley const char *name; 75187828ca2SBarry Smith PetscScalar *v; 752f3ef73ceSBarry Smith PetscViewerFormat format; 753932b0c3eSLois Curfman McInnes 7543a40ed3dSBarry Smith PetscFunctionBegin; 755435da068SBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 756b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 757456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 7583a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 759fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 760b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 761899cda47SBarry Smith for (i=0; i<A->rmap.n; i++) { 76244cd7ae7SLois Curfman McInnes v = a->v + i; 76377431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 764899cda47SBarry Smith for (j=0; j<A->cmap.n; j++) { 765aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 766329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 767a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 768329f5518SBarry Smith } else if (PetscRealPart(*v)) { 769a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr); 7706831982aSBarry Smith } 77180cd9d93SLois Curfman McInnes #else 7726831982aSBarry Smith if (*v) { 773a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr); 7746831982aSBarry Smith } 77580cd9d93SLois Curfman McInnes #endif 7761b807ce4Svictorle v += a->lda; 77780cd9d93SLois Curfman McInnes } 778b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 77980cd9d93SLois Curfman McInnes } 780b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 7813a40ed3dSBarry Smith } else { 782b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 783aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 784ffac6cdbSBarry Smith PetscTruth allreal = PETSC_TRUE; 78547989497SBarry Smith /* determine if matrix has all real values */ 78647989497SBarry Smith v = a->v; 787899cda47SBarry Smith for (i=0; i<A->rmap.n*A->cmap.n; i++) { 788ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;} 78947989497SBarry Smith } 79047989497SBarry Smith #endif 791fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 7923a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 793899cda47SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap.n,A->cmap.n);CHKERRQ(ierr); 794899cda47SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap.n,A->cmap.n);CHKERRQ(ierr); 795fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 796ffac6cdbSBarry Smith } 797ffac6cdbSBarry Smith 798899cda47SBarry Smith for (i=0; i<A->rmap.n; i++) { 799932b0c3eSLois Curfman McInnes v = a->v + i; 800899cda47SBarry Smith for (j=0; j<A->cmap.n; j++) { 801aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 80247989497SBarry Smith if (allreal) { 8031b807ce4Svictorle ierr = PetscViewerASCIIPrintf(viewer,"%6.4e ",PetscRealPart(*v));CHKERRQ(ierr); 80447989497SBarry Smith } else { 8051b807ce4Svictorle ierr = PetscViewerASCIIPrintf(viewer,"%6.4e + %6.4e i ",PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 80647989497SBarry Smith } 807289bc588SBarry Smith #else 8081b807ce4Svictorle ierr = PetscViewerASCIIPrintf(viewer,"%6.4e ",*v);CHKERRQ(ierr); 809289bc588SBarry Smith #endif 8101b807ce4Svictorle v += a->lda; 811289bc588SBarry Smith } 812b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 813289bc588SBarry Smith } 814fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 815b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 816ffac6cdbSBarry Smith } 817b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 818da3a660dSBarry Smith } 819b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 8203a40ed3dSBarry Smith PetscFunctionReturn(0); 821289bc588SBarry Smith } 822289bc588SBarry Smith 8234a2ae208SSatish Balay #undef __FUNCT__ 8244a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary" 8256849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 826932b0c3eSLois Curfman McInnes { 827932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 8286849ba73SBarry Smith PetscErrorCode ierr; 82913f74950SBarry Smith int fd; 830899cda47SBarry Smith PetscInt ict,j,n = A->cmap.n,m = A->rmap.n,i,*col_lens,nz = m*n; 83187828ca2SBarry Smith PetscScalar *v,*anonz,*vals; 832f3ef73ceSBarry Smith PetscViewerFormat format; 833932b0c3eSLois Curfman McInnes 8343a40ed3dSBarry Smith PetscFunctionBegin; 835b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 83690ace30eSBarry Smith 837b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 838fb9695e5SSatish Balay if (format == PETSC_VIEWER_BINARY_NATIVE) { 83990ace30eSBarry Smith /* store the matrix as a dense matrix */ 84013f74950SBarry Smith ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 841552e946dSBarry Smith col_lens[0] = MAT_FILE_COOKIE; 84290ace30eSBarry Smith col_lens[1] = m; 84390ace30eSBarry Smith col_lens[2] = n; 84490ace30eSBarry Smith col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 8456f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 846606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 84790ace30eSBarry Smith 84890ace30eSBarry Smith /* write out matrix, by rows */ 84987828ca2SBarry Smith ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr); 85090ace30eSBarry Smith v = a->v; 85190ace30eSBarry Smith for (i=0; i<m; i++) { 85290ace30eSBarry Smith for (j=0; j<n; j++) { 85390ace30eSBarry Smith vals[i + j*m] = *v++; 85490ace30eSBarry Smith } 85590ace30eSBarry Smith } 8566f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 857606d414cSSatish Balay ierr = PetscFree(vals);CHKERRQ(ierr); 85890ace30eSBarry Smith } else { 85913f74950SBarry Smith ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 860552e946dSBarry Smith col_lens[0] = MAT_FILE_COOKIE; 861932b0c3eSLois Curfman McInnes col_lens[1] = m; 862932b0c3eSLois Curfman McInnes col_lens[2] = n; 863932b0c3eSLois Curfman McInnes col_lens[3] = nz; 864932b0c3eSLois Curfman McInnes 865932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 866932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 8676f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 868932b0c3eSLois Curfman McInnes 869932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 870932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 871932b0c3eSLois Curfman McInnes ict = 0; 872932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 873932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 874932b0c3eSLois Curfman McInnes } 8756f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 876606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 877932b0c3eSLois Curfman McInnes 878932b0c3eSLois Curfman McInnes /* store nonzero values */ 87987828ca2SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr); 880932b0c3eSLois Curfman McInnes ict = 0; 881932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 882932b0c3eSLois Curfman McInnes v = a->v + i; 883932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 8841b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 885932b0c3eSLois Curfman McInnes } 886932b0c3eSLois Curfman McInnes } 8876f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 888606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 88990ace30eSBarry Smith } 8903a40ed3dSBarry Smith PetscFunctionReturn(0); 891932b0c3eSLois Curfman McInnes } 892932b0c3eSLois Curfman McInnes 8934a2ae208SSatish Balay #undef __FUNCT__ 8944a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom" 895dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 896f1af5d2fSBarry Smith { 897f1af5d2fSBarry Smith Mat A = (Mat) Aa; 898f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 8996849ba73SBarry Smith PetscErrorCode ierr; 900899cda47SBarry Smith PetscInt m = A->rmap.n,n = A->cmap.n,color,i,j; 90187828ca2SBarry Smith PetscScalar *v = a->v; 902b0a32e0cSBarry Smith PetscViewer viewer; 903b0a32e0cSBarry Smith PetscDraw popup; 904329f5518SBarry Smith PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0; 905f3ef73ceSBarry Smith PetscViewerFormat format; 906f1af5d2fSBarry Smith 907f1af5d2fSBarry Smith PetscFunctionBegin; 908f1af5d2fSBarry Smith 909f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 910b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 911b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 912f1af5d2fSBarry Smith 913f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 914fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 915f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 916b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 917f1af5d2fSBarry Smith for(j = 0; j < n; j++) { 918f1af5d2fSBarry Smith x_l = j; 919f1af5d2fSBarry Smith x_r = x_l + 1.0; 920f1af5d2fSBarry Smith for(i = 0; i < m; i++) { 921f1af5d2fSBarry Smith y_l = m - i - 1.0; 922f1af5d2fSBarry Smith y_r = y_l + 1.0; 923f1af5d2fSBarry Smith #if defined(PETSC_USE_COMPLEX) 924329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 925b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 926329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 927b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 928f1af5d2fSBarry Smith } else { 929f1af5d2fSBarry Smith continue; 930f1af5d2fSBarry Smith } 931f1af5d2fSBarry Smith #else 932f1af5d2fSBarry Smith if (v[j*m+i] > 0.) { 933b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 934f1af5d2fSBarry Smith } else if (v[j*m+i] < 0.) { 935b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 936f1af5d2fSBarry Smith } else { 937f1af5d2fSBarry Smith continue; 938f1af5d2fSBarry Smith } 939f1af5d2fSBarry Smith #endif 940b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 941f1af5d2fSBarry Smith } 942f1af5d2fSBarry Smith } 943f1af5d2fSBarry Smith } else { 944f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 945f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 946f1af5d2fSBarry Smith for(i = 0; i < m*n; i++) { 947f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 948f1af5d2fSBarry Smith } 949b0a32e0cSBarry Smith scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv; 950b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 951b0a32e0cSBarry Smith if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);} 952f1af5d2fSBarry Smith for(j = 0; j < n; j++) { 953f1af5d2fSBarry Smith x_l = j; 954f1af5d2fSBarry Smith x_r = x_l + 1.0; 955f1af5d2fSBarry Smith for(i = 0; i < m; i++) { 956f1af5d2fSBarry Smith y_l = m - i - 1.0; 957f1af5d2fSBarry Smith y_r = y_l + 1.0; 958b0a32e0cSBarry Smith color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i])); 959b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 960f1af5d2fSBarry Smith } 961f1af5d2fSBarry Smith } 962f1af5d2fSBarry Smith } 963f1af5d2fSBarry Smith PetscFunctionReturn(0); 964f1af5d2fSBarry Smith } 965f1af5d2fSBarry Smith 9664a2ae208SSatish Balay #undef __FUNCT__ 9674a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 968dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 969f1af5d2fSBarry Smith { 970b0a32e0cSBarry Smith PetscDraw draw; 971f1af5d2fSBarry Smith PetscTruth isnull; 972329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 973dfbe8321SBarry Smith PetscErrorCode ierr; 974f1af5d2fSBarry Smith 975f1af5d2fSBarry Smith PetscFunctionBegin; 976b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 977b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 978abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 979f1af5d2fSBarry Smith 980f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 981899cda47SBarry Smith xr = A->cmap.n; yr = A->rmap.n; h = yr/10.0; w = xr/10.0; 982f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 983b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 984b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 985f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr); 986f1af5d2fSBarry Smith PetscFunctionReturn(0); 987f1af5d2fSBarry Smith } 988f1af5d2fSBarry Smith 9894a2ae208SSatish Balay #undef __FUNCT__ 9904a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 991dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 992932b0c3eSLois Curfman McInnes { 993dfbe8321SBarry Smith PetscErrorCode ierr; 99432077d6dSBarry Smith PetscTruth issocket,iascii,isbinary,isdraw; 995932b0c3eSLois Curfman McInnes 9963a40ed3dSBarry Smith PetscFunctionBegin; 997b0a32e0cSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_SOCKET,&issocket);CHKERRQ(ierr); 99832077d6dSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 999fb9695e5SSatish Balay ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr); 1000fb9695e5SSatish Balay ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_DRAW,&isdraw);CHKERRQ(ierr); 10010f5bd95cSBarry Smith 1002c45a1595SBarry Smith if (iascii) { 1003c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 10044cf18111SSatish Balay #if defined(PETSC_USE_SOCKET_VIEWER) 1005c45a1595SBarry Smith } else if (issocket) { 10064cf18111SSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1007899cda47SBarry Smith if (a->lda>A->rmap.n) SETERRQ(PETSC_ERR_SUP,"Case can not handle LDA"); 1008899cda47SBarry Smith ierr = PetscViewerSocketPutScalar(viewer,A->rmap.n,A->cmap.n,a->v);CHKERRQ(ierr); 1009c45a1595SBarry Smith #endif 10100f5bd95cSBarry Smith } else if (isbinary) { 10113a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1012f1af5d2fSBarry Smith } else if (isdraw) { 1013f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 10145cd90555SBarry Smith } else { 1015958c9bccSBarry Smith SETERRQ1(PETSC_ERR_SUP,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name); 1016932b0c3eSLois Curfman McInnes } 10173a40ed3dSBarry Smith PetscFunctionReturn(0); 1018932b0c3eSLois Curfman McInnes } 1019289bc588SBarry Smith 10204a2ae208SSatish Balay #undef __FUNCT__ 10214a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1022dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat) 1023289bc588SBarry Smith { 1024ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1025dfbe8321SBarry Smith PetscErrorCode ierr; 102690f02eecSBarry Smith 10273a40ed3dSBarry Smith PetscFunctionBegin; 1028aa482453SBarry Smith #if defined(PETSC_USE_LOG) 1029899cda47SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap.n,mat->cmap.n); 1030a5a9c739SBarry Smith #endif 103105b42c5fSBarry Smith ierr = PetscFree(l->pivots);CHKERRQ(ierr); 1032*6857c123SSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1033606d414cSSatish Balay ierr = PetscFree(l);CHKERRQ(ierr); 1034901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr); 10353a40ed3dSBarry Smith PetscFunctionReturn(0); 1036289bc588SBarry Smith } 1037289bc588SBarry Smith 10384a2ae208SSatish Balay #undef __FUNCT__ 10394a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1040dfbe8321SBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,Mat *matout) 1041289bc588SBarry Smith { 1042c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 10436849ba73SBarry Smith PetscErrorCode ierr; 104413f74950SBarry Smith PetscInt k,j,m,n,M; 104587828ca2SBarry Smith PetscScalar *v,tmp; 104648b35521SBarry Smith 10473a40ed3dSBarry Smith PetscFunctionBegin; 1048899cda47SBarry Smith v = mat->v; m = A->rmap.n; M = mat->lda; n = A->cmap.n; 10497c922b88SBarry Smith if (!matout) { /* in place transpose */ 1050a5ce6ee0Svictorle if (m != n) { 1051634064b4SBarry Smith SETERRQ(PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1052d64ed03dSBarry Smith } else { 1053d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1054289bc588SBarry Smith for (k=0; k<j; k++) { 10551b807ce4Svictorle tmp = v[j + k*M]; 10561b807ce4Svictorle v[j + k*M] = v[k + j*M]; 10571b807ce4Svictorle v[k + j*M] = tmp; 1058289bc588SBarry Smith } 1059289bc588SBarry Smith } 1060d64ed03dSBarry Smith } 10613a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1062d3e5ee88SLois Curfman McInnes Mat tmat; 1063ec8511deSBarry Smith Mat_SeqDense *tmatd; 106487828ca2SBarry Smith PetscScalar *v2; 1065ea709b57SSatish Balay 1066f69a0ea3SMatthew Knepley ierr = MatCreate(A->comm,&tmat);CHKERRQ(ierr); 1067899cda47SBarry Smith ierr = MatSetSizes(tmat,A->cmap.n,A->rmap.n,A->cmap.n,A->rmap.n);CHKERRQ(ierr); 10685c5985e7SKris Buschelman ierr = MatSetType(tmat,A->type_name);CHKERRQ(ierr); 10695c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr); 1070ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 10710de55854SLois Curfman McInnes v = mat->v; v2 = tmatd->v; 1072d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 10731b807ce4Svictorle for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M]; 1074d3e5ee88SLois Curfman McInnes } 10756d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 10766d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1077d3e5ee88SLois Curfman McInnes *matout = tmat; 107848b35521SBarry Smith } 10793a40ed3dSBarry Smith PetscFunctionReturn(0); 1080289bc588SBarry Smith } 1081289bc588SBarry Smith 10824a2ae208SSatish Balay #undef __FUNCT__ 10834a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1084dfbe8321SBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscTruth *flg) 1085289bc588SBarry Smith { 1086c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1087c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 108813f74950SBarry Smith PetscInt i,j; 108987828ca2SBarry Smith PetscScalar *v1 = mat1->v,*v2 = mat2->v; 10909ea5d5aeSSatish Balay 10913a40ed3dSBarry Smith PetscFunctionBegin; 1092899cda47SBarry Smith if (A1->rmap.n != A2->rmap.n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1093899cda47SBarry Smith if (A1->cmap.n != A2->cmap.n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1094899cda47SBarry Smith for (i=0; i<A1->rmap.n; i++) { 10951b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 1096899cda47SBarry Smith for (j=0; j<A1->cmap.n; j++) { 10973a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 10981b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 10991b807ce4Svictorle } 1100289bc588SBarry Smith } 110177c4ece6SBarry Smith *flg = PETSC_TRUE; 11023a40ed3dSBarry Smith PetscFunctionReturn(0); 1103289bc588SBarry Smith } 1104289bc588SBarry Smith 11054a2ae208SSatish Balay #undef __FUNCT__ 11064a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1107dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1108289bc588SBarry Smith { 1109c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1110dfbe8321SBarry Smith PetscErrorCode ierr; 111113f74950SBarry Smith PetscInt i,n,len; 111287828ca2SBarry Smith PetscScalar *x,zero = 0.0; 111344cd7ae7SLois Curfman McInnes 11143a40ed3dSBarry Smith PetscFunctionBegin; 11152dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 11167a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 11171ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1118899cda47SBarry Smith len = PetscMin(A->rmap.n,A->cmap.n); 1119899cda47SBarry Smith if (n != A->rmap.n) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 112044cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 11211b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1122289bc588SBarry Smith } 11231ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 11243a40ed3dSBarry Smith PetscFunctionReturn(0); 1125289bc588SBarry Smith } 1126289bc588SBarry Smith 11274a2ae208SSatish Balay #undef __FUNCT__ 11284a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1129dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1130289bc588SBarry Smith { 1131c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 113287828ca2SBarry Smith PetscScalar *l,*r,x,*v; 1133dfbe8321SBarry Smith PetscErrorCode ierr; 1134899cda47SBarry Smith PetscInt i,j,m = A->rmap.n,n = A->cmap.n; 113555659b69SBarry Smith 11363a40ed3dSBarry Smith PetscFunctionBegin; 113728988994SBarry Smith if (ll) { 11387a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 11391ebc52fbSHong Zhang ierr = VecGetArray(ll,&l);CHKERRQ(ierr); 1140899cda47SBarry Smith if (m != A->rmap.n) SETERRQ(PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1141da3a660dSBarry Smith for (i=0; i<m; i++) { 1142da3a660dSBarry Smith x = l[i]; 1143da3a660dSBarry Smith v = mat->v + i; 1144da3a660dSBarry Smith for (j=0; j<n; j++) { (*v) *= x; v+= m;} 1145da3a660dSBarry Smith } 11461ebc52fbSHong Zhang ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr); 1147efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1148da3a660dSBarry Smith } 114928988994SBarry Smith if (rr) { 11507a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 11511ebc52fbSHong Zhang ierr = VecGetArray(rr,&r);CHKERRQ(ierr); 1152899cda47SBarry Smith if (n != A->cmap.n) SETERRQ(PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1153da3a660dSBarry Smith for (i=0; i<n; i++) { 1154da3a660dSBarry Smith x = r[i]; 1155da3a660dSBarry Smith v = mat->v + i*m; 1156da3a660dSBarry Smith for (j=0; j<m; j++) { (*v++) *= x;} 1157da3a660dSBarry Smith } 11581ebc52fbSHong Zhang ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr); 1159efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1160da3a660dSBarry Smith } 11613a40ed3dSBarry Smith PetscFunctionReturn(0); 1162289bc588SBarry Smith } 1163289bc588SBarry Smith 11644a2ae208SSatish Balay #undef __FUNCT__ 11654a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1166dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1167289bc588SBarry Smith { 1168c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 116987828ca2SBarry Smith PetscScalar *v = mat->v; 1170329f5518SBarry Smith PetscReal sum = 0.0; 1171899cda47SBarry Smith PetscInt lda=mat->lda,m=A->rmap.n,i,j; 1172efee365bSSatish Balay PetscErrorCode ierr; 117355659b69SBarry Smith 11743a40ed3dSBarry Smith PetscFunctionBegin; 1175289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1176a5ce6ee0Svictorle if (lda>m) { 1177899cda47SBarry Smith for (j=0; j<A->cmap.n; j++) { 1178a5ce6ee0Svictorle v = mat->v+j*lda; 1179a5ce6ee0Svictorle for (i=0; i<m; i++) { 1180a5ce6ee0Svictorle #if defined(PETSC_USE_COMPLEX) 1181a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1182a5ce6ee0Svictorle #else 1183a5ce6ee0Svictorle sum += (*v)*(*v); v++; 1184a5ce6ee0Svictorle #endif 1185a5ce6ee0Svictorle } 1186a5ce6ee0Svictorle } 1187a5ce6ee0Svictorle } else { 1188899cda47SBarry Smith for (i=0; i<A->cmap.n*A->rmap.n; i++) { 1189aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1190329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1191289bc588SBarry Smith #else 1192289bc588SBarry Smith sum += (*v)*(*v); v++; 1193289bc588SBarry Smith #endif 1194289bc588SBarry Smith } 1195a5ce6ee0Svictorle } 1196064f8208SBarry Smith *nrm = sqrt(sum); 1197899cda47SBarry Smith ierr = PetscLogFlops(2*A->cmap.n*A->rmap.n);CHKERRQ(ierr); 11983a40ed3dSBarry Smith } else if (type == NORM_1) { 1199064f8208SBarry Smith *nrm = 0.0; 1200899cda47SBarry Smith for (j=0; j<A->cmap.n; j++) { 12011b807ce4Svictorle v = mat->v + j*mat->lda; 1202289bc588SBarry Smith sum = 0.0; 1203899cda47SBarry Smith for (i=0; i<A->rmap.n; i++) { 120433a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1205289bc588SBarry Smith } 1206064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1207289bc588SBarry Smith } 1208899cda47SBarry Smith ierr = PetscLogFlops(A->cmap.n*A->rmap.n);CHKERRQ(ierr); 12093a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1210064f8208SBarry Smith *nrm = 0.0; 1211899cda47SBarry Smith for (j=0; j<A->rmap.n; j++) { 1212289bc588SBarry Smith v = mat->v + j; 1213289bc588SBarry Smith sum = 0.0; 1214899cda47SBarry Smith for (i=0; i<A->cmap.n; i++) { 12151b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1216289bc588SBarry Smith } 1217064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1218289bc588SBarry Smith } 1219899cda47SBarry Smith ierr = PetscLogFlops(A->cmap.n*A->rmap.n);CHKERRQ(ierr); 12203a40ed3dSBarry Smith } else { 122129bbc08cSBarry Smith SETERRQ(PETSC_ERR_SUP,"No two norm"); 1222289bc588SBarry Smith } 12233a40ed3dSBarry Smith PetscFunctionReturn(0); 1224289bc588SBarry Smith } 1225289bc588SBarry Smith 12264a2ae208SSatish Balay #undef __FUNCT__ 12274a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1228dfbe8321SBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op) 1229289bc588SBarry Smith { 1230c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 123163ba0a88SBarry Smith PetscErrorCode ierr; 123267e560aaSBarry Smith 12333a40ed3dSBarry Smith PetscFunctionBegin; 1234b5a2b587SKris Buschelman switch (op) { 1235b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 1236b5a2b587SKris Buschelman aij->roworiented = PETSC_TRUE; 1237b5a2b587SKris Buschelman break; 1238b5a2b587SKris Buschelman case MAT_COLUMN_ORIENTED: 1239b5a2b587SKris Buschelman aij->roworiented = PETSC_FALSE; 1240b5a2b587SKris Buschelman break; 1241b5a2b587SKris Buschelman case MAT_ROWS_SORTED: 1242b5a2b587SKris Buschelman case MAT_ROWS_UNSORTED: 1243b5a2b587SKris Buschelman case MAT_COLUMNS_SORTED: 1244b5a2b587SKris Buschelman case MAT_COLUMNS_UNSORTED: 1245b5a2b587SKris Buschelman case MAT_NO_NEW_NONZERO_LOCATIONS: 1246b5a2b587SKris Buschelman case MAT_YES_NEW_NONZERO_LOCATIONS: 1247b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 1248b5a2b587SKris Buschelman case MAT_NO_NEW_DIAGONALS: 1249b5a2b587SKris Buschelman case MAT_YES_NEW_DIAGONALS: 1250b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1251b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 1252ae15b995SBarry Smith ierr = PetscInfo(A,"Option ignored\n");CHKERRQ(ierr); 1253b5a2b587SKris Buschelman break; 125477e54ba9SKris Buschelman case MAT_SYMMETRIC: 125577e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 12569a4540c5SBarry Smith case MAT_NOT_SYMMETRIC: 12579a4540c5SBarry Smith case MAT_NOT_STRUCTURALLY_SYMMETRIC: 12589a4540c5SBarry Smith case MAT_HERMITIAN: 12599a4540c5SBarry Smith case MAT_NOT_HERMITIAN: 12609a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 12619a4540c5SBarry Smith case MAT_NOT_SYMMETRY_ETERNAL: 126277e54ba9SKris Buschelman break; 1263b5a2b587SKris Buschelman default: 126429bbc08cSBarry Smith SETERRQ(PETSC_ERR_SUP,"unknown option"); 12653a40ed3dSBarry Smith } 12663a40ed3dSBarry Smith PetscFunctionReturn(0); 1267289bc588SBarry Smith } 1268289bc588SBarry Smith 12694a2ae208SSatish Balay #undef __FUNCT__ 12704a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1271dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A) 12726f0a148fSBarry Smith { 1273ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 12746849ba73SBarry Smith PetscErrorCode ierr; 1275899cda47SBarry Smith PetscInt lda=l->lda,m=A->rmap.n,j; 12763a40ed3dSBarry Smith 12773a40ed3dSBarry Smith PetscFunctionBegin; 1278a5ce6ee0Svictorle if (lda>m) { 1279899cda47SBarry Smith for (j=0; j<A->cmap.n; j++) { 1280a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1281a5ce6ee0Svictorle } 1282a5ce6ee0Svictorle } else { 1283899cda47SBarry Smith ierr = PetscMemzero(l->v,A->rmap.n*A->cmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 1284a5ce6ee0Svictorle } 12853a40ed3dSBarry Smith PetscFunctionReturn(0); 12866f0a148fSBarry Smith } 12876f0a148fSBarry Smith 12884a2ae208SSatish Balay #undef __FUNCT__ 12894a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 1290f4df32b1SMatthew Knepley PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag) 12916f0a148fSBarry Smith { 1292ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1293899cda47SBarry Smith PetscInt n = A->cmap.n,i,j; 129487828ca2SBarry Smith PetscScalar *slot; 129555659b69SBarry Smith 12963a40ed3dSBarry Smith PetscFunctionBegin; 12976f0a148fSBarry Smith for (i=0; i<N; i++) { 12986f0a148fSBarry Smith slot = l->v + rows[i]; 12996f0a148fSBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += n;} 13006f0a148fSBarry Smith } 1301f4df32b1SMatthew Knepley if (diag != 0.0) { 13026f0a148fSBarry Smith for (i=0; i<N; i++) { 13036f0a148fSBarry Smith slot = l->v + (n+1)*rows[i]; 1304f4df32b1SMatthew Knepley *slot = diag; 13056f0a148fSBarry Smith } 13066f0a148fSBarry Smith } 13073a40ed3dSBarry Smith PetscFunctionReturn(0); 13086f0a148fSBarry Smith } 1309557bce09SLois Curfman McInnes 13104a2ae208SSatish Balay #undef __FUNCT__ 13114a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqDense" 1312dfbe8321SBarry Smith PetscErrorCode MatGetArray_SeqDense(Mat A,PetscScalar *array[]) 131364e87e97SBarry Smith { 1314c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 13153a40ed3dSBarry Smith 13163a40ed3dSBarry Smith PetscFunctionBegin; 1317899cda47SBarry Smith if (mat->lda != A->rmap.n) SETERRQ(PETSC_ERR_SUP,"Cannot get array for Dense matrices with LDA different from number of rows"); 131864e87e97SBarry Smith *array = mat->v; 13193a40ed3dSBarry Smith PetscFunctionReturn(0); 132064e87e97SBarry Smith } 13210754003eSLois Curfman McInnes 13224a2ae208SSatish Balay #undef __FUNCT__ 13234a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense" 1324dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1325ff14e315SSatish Balay { 13263a40ed3dSBarry Smith PetscFunctionBegin; 132709b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 13283a40ed3dSBarry Smith PetscFunctionReturn(0); 1329ff14e315SSatish Balay } 13300754003eSLois Curfman McInnes 13314a2ae208SSatish Balay #undef __FUNCT__ 13324a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 133313f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 13340754003eSLois Curfman McInnes { 1335c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 13366849ba73SBarry Smith PetscErrorCode ierr; 133721a2c019SBarry Smith PetscInt i,j,*irow,*icol,nrows,ncols; 133887828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 13390754003eSLois Curfman McInnes Mat newmat; 13400754003eSLois Curfman McInnes 13413a40ed3dSBarry Smith PetscFunctionBegin; 134278b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 134378b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1344e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1345e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 13460754003eSLois Curfman McInnes 1347182d2002SSatish Balay /* Check submatrixcall */ 1348182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 134913f74950SBarry Smith PetscInt n_cols,n_rows; 1350182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 135121a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 135221a2c019SBarry Smith /* resize the result result matrix to match number of requested rows/columns */ 135321a2c019SBarry Smith ierr = MatSetSizes(*B,nrows,nrows,nrows,nrows);CHKERRQ(ierr); 135421a2c019SBarry Smith } 1355182d2002SSatish Balay newmat = *B; 1356182d2002SSatish Balay } else { 13570754003eSLois Curfman McInnes /* Create and fill new matrix */ 1358f69a0ea3SMatthew Knepley ierr = MatCreate(A->comm,&newmat);CHKERRQ(ierr); 1359f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 13605c5985e7SKris Buschelman ierr = MatSetType(newmat,A->type_name);CHKERRQ(ierr); 13615c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr); 1362182d2002SSatish Balay } 1363182d2002SSatish Balay 1364182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1365182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1366182d2002SSatish Balay 1367182d2002SSatish Balay for (i=0; i<ncols; i++) { 13686de62eeeSBarry Smith av = v + mat->lda*icol[i]; 1369182d2002SSatish Balay for (j=0; j<nrows; j++) { 1370182d2002SSatish Balay *bv++ = av[irow[j]]; 13710754003eSLois Curfman McInnes } 13720754003eSLois Curfman McInnes } 1373182d2002SSatish Balay 1374182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 13756d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 13766d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 13770754003eSLois Curfman McInnes 13780754003eSLois Curfman McInnes /* Free work space */ 137978b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 138078b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1381182d2002SSatish Balay *B = newmat; 13823a40ed3dSBarry Smith PetscFunctionReturn(0); 13830754003eSLois Curfman McInnes } 13840754003eSLois Curfman McInnes 13854a2ae208SSatish Balay #undef __FUNCT__ 13864a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 138713f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1388905e6a2fSBarry Smith { 13896849ba73SBarry Smith PetscErrorCode ierr; 139013f74950SBarry Smith PetscInt i; 1391905e6a2fSBarry Smith 13923a40ed3dSBarry Smith PetscFunctionBegin; 1393905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1394b0a32e0cSBarry Smith ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr); 1395905e6a2fSBarry Smith } 1396905e6a2fSBarry Smith 1397905e6a2fSBarry Smith for (i=0; i<n; i++) { 13986a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1399905e6a2fSBarry Smith } 14003a40ed3dSBarry Smith PetscFunctionReturn(0); 1401905e6a2fSBarry Smith } 1402905e6a2fSBarry Smith 14034a2ae208SSatish Balay #undef __FUNCT__ 1404c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1405c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1406c0aa2d19SHong Zhang { 1407c0aa2d19SHong Zhang PetscFunctionBegin; 1408c0aa2d19SHong Zhang PetscFunctionReturn(0); 1409c0aa2d19SHong Zhang } 1410c0aa2d19SHong Zhang 1411c0aa2d19SHong Zhang #undef __FUNCT__ 1412c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1413c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1414c0aa2d19SHong Zhang { 1415c0aa2d19SHong Zhang PetscFunctionBegin; 1416c0aa2d19SHong Zhang PetscFunctionReturn(0); 1417c0aa2d19SHong Zhang } 1418c0aa2d19SHong Zhang 1419c0aa2d19SHong Zhang #undef __FUNCT__ 14204a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1421dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 14224b0e389bSBarry Smith { 14234b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data; 14246849ba73SBarry Smith PetscErrorCode ierr; 1425899cda47SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->rmap.n,n=A->cmap.n, j; 14263a40ed3dSBarry Smith 14273a40ed3dSBarry Smith PetscFunctionBegin; 142833f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 142933f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1430cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 14313a40ed3dSBarry Smith PetscFunctionReturn(0); 14323a40ed3dSBarry Smith } 1433899cda47SBarry Smith if (m != B->rmap.n || n != B->cmap.n) SETERRQ(PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1434a5ce6ee0Svictorle if (lda1>m || lda2>m) { 14350dbb7854Svictorle for (j=0; j<n; j++) { 1436a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1437a5ce6ee0Svictorle } 1438a5ce6ee0Svictorle } else { 1439899cda47SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->rmap.n*A->cmap.n*sizeof(PetscScalar));CHKERRQ(ierr); 1440a5ce6ee0Svictorle } 1441273d9f13SBarry Smith PetscFunctionReturn(0); 1442273d9f13SBarry Smith } 1443273d9f13SBarry Smith 14444a2ae208SSatish Balay #undef __FUNCT__ 14454a2ae208SSatish Balay #define __FUNCT__ "MatSetUpPreallocation_SeqDense" 1446dfbe8321SBarry Smith PetscErrorCode MatSetUpPreallocation_SeqDense(Mat A) 1447273d9f13SBarry Smith { 1448dfbe8321SBarry Smith PetscErrorCode ierr; 1449273d9f13SBarry Smith 1450273d9f13SBarry Smith PetscFunctionBegin; 1451273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 14523a40ed3dSBarry Smith PetscFunctionReturn(0); 14534b0e389bSBarry Smith } 14544b0e389bSBarry Smith 1455284134d9SBarry Smith #undef __FUNCT__ 1456284134d9SBarry Smith #define __FUNCT__ "MatSetSizes_SeqDense" 1457284134d9SBarry Smith PetscErrorCode MatSetSizes_SeqDense(Mat A,PetscInt m,PetscInt n,PetscInt M,PetscInt N) 1458284134d9SBarry Smith { 1459284134d9SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 146021a2c019SBarry Smith PetscErrorCode ierr; 1461284134d9SBarry Smith PetscFunctionBegin; 146221a2c019SBarry Smith /* this will not be called before lda, Mmax, and Nmax have been set */ 1463284134d9SBarry Smith m = PetscMax(m,M); 1464284134d9SBarry Smith n = PetscMax(n,N); 146521a2c019SBarry 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); 1466284134d9SBarry 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); 1467899cda47SBarry Smith A->rmap.n = A->rmap.n = m; 1468899cda47SBarry Smith A->cmap.n = A->cmap.N = n; 146921a2c019SBarry Smith if (a->changelda) a->lda = m; 147021a2c019SBarry Smith ierr = PetscMemzero(a->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr); 1471284134d9SBarry Smith PetscFunctionReturn(0); 1472284134d9SBarry Smith } 1473284134d9SBarry Smith 1474a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1475a9fe9ddaSSatish Balay #undef __FUNCT__ 1476a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1477a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1478a9fe9ddaSSatish Balay { 1479a9fe9ddaSSatish Balay PetscErrorCode ierr; 1480a9fe9ddaSSatish Balay 1481a9fe9ddaSSatish Balay PetscFunctionBegin; 1482a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX){ 1483a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1484a9fe9ddaSSatish Balay } 1485a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1486a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1487a9fe9ddaSSatish Balay } 1488a9fe9ddaSSatish Balay 1489a9fe9ddaSSatish Balay #undef __FUNCT__ 1490a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1491a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1492a9fe9ddaSSatish Balay { 1493ee16a9a1SHong Zhang PetscErrorCode ierr; 1494899cda47SBarry Smith PetscInt m=A->rmap.n,n=B->cmap.n; 1495ee16a9a1SHong Zhang Mat Cmat; 1496a9fe9ddaSSatish Balay 1497ee16a9a1SHong Zhang PetscFunctionBegin; 1498899cda47SBarry 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); 1499ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1500ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1501ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1502ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1503ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 1504ee16a9a1SHong Zhang *C = Cmat; 1505ee16a9a1SHong Zhang PetscFunctionReturn(0); 1506ee16a9a1SHong Zhang } 1507a9fe9ddaSSatish Balay 1508a9fe9ddaSSatish Balay #undef __FUNCT__ 1509a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1510a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1511a9fe9ddaSSatish Balay { 1512a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1513a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1514a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 1515899cda47SBarry Smith PetscBLASInt m=(PetscBLASInt)A->rmap.n,n=(PetscBLASInt)B->cmap.n,k=(PetscBLASInt)A->cmap.n; 1516a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1517a9fe9ddaSSatish Balay 1518a9fe9ddaSSatish Balay PetscFunctionBegin; 1519a9fe9ddaSSatish Balay BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1520a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1521a9fe9ddaSSatish Balay } 1522a9fe9ddaSSatish Balay 1523a9fe9ddaSSatish Balay #undef __FUNCT__ 1524a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTranspose_SeqDense_SeqDense" 1525a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTranspose_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1526a9fe9ddaSSatish Balay { 1527a9fe9ddaSSatish Balay PetscErrorCode ierr; 1528a9fe9ddaSSatish Balay 1529a9fe9ddaSSatish Balay PetscFunctionBegin; 1530a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX){ 1531a9fe9ddaSSatish Balay ierr = MatMatMultTransposeSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1532a9fe9ddaSSatish Balay } 1533a9fe9ddaSSatish Balay ierr = MatMatMultTransposeNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1534a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1535a9fe9ddaSSatish Balay } 1536a9fe9ddaSSatish Balay 1537a9fe9ddaSSatish Balay #undef __FUNCT__ 1538a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeSymbolic_SeqDense_SeqDense" 1539a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1540a9fe9ddaSSatish Balay { 1541ee16a9a1SHong Zhang PetscErrorCode ierr; 1542899cda47SBarry Smith PetscInt m=A->cmap.n,n=B->cmap.n; 1543ee16a9a1SHong Zhang Mat Cmat; 1544a9fe9ddaSSatish Balay 1545ee16a9a1SHong Zhang PetscFunctionBegin; 1546899cda47SBarry 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); 1547ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1548ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1549ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1550ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1551ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 1552ee16a9a1SHong Zhang *C = Cmat; 1553ee16a9a1SHong Zhang PetscFunctionReturn(0); 1554ee16a9a1SHong Zhang } 1555a9fe9ddaSSatish Balay 1556a9fe9ddaSSatish Balay #undef __FUNCT__ 1557a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeNumeric_SeqDense_SeqDense" 1558a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1559a9fe9ddaSSatish Balay { 1560a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1561a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1562a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 1563899cda47SBarry Smith PetscBLASInt m=(PetscBLASInt)A->cmap.n,n=(PetscBLASInt)B->cmap.n,k=(PetscBLASInt)A->rmap.n; 1564a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1565a9fe9ddaSSatish Balay 1566a9fe9ddaSSatish Balay PetscFunctionBegin; 1567a9fe9ddaSSatish Balay BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1568a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1569a9fe9ddaSSatish Balay } 1570289bc588SBarry Smith /* -------------------------------------------------------------------*/ 1571a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense, 1572905e6a2fSBarry Smith MatGetRow_SeqDense, 1573905e6a2fSBarry Smith MatRestoreRow_SeqDense, 1574905e6a2fSBarry Smith MatMult_SeqDense, 157597304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 15767c922b88SBarry Smith MatMultTranspose_SeqDense, 15777c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 1578905e6a2fSBarry Smith MatSolve_SeqDense, 1579905e6a2fSBarry Smith MatSolveAdd_SeqDense, 15807c922b88SBarry Smith MatSolveTranspose_SeqDense, 158197304618SKris Buschelman /*10*/ MatSolveTransposeAdd_SeqDense, 1582905e6a2fSBarry Smith MatLUFactor_SeqDense, 1583905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 1584ec8511deSBarry Smith MatRelax_SeqDense, 1585ec8511deSBarry Smith MatTranspose_SeqDense, 158697304618SKris Buschelman /*15*/ MatGetInfo_SeqDense, 1587905e6a2fSBarry Smith MatEqual_SeqDense, 1588905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 1589905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 1590905e6a2fSBarry Smith MatNorm_SeqDense, 1591c0aa2d19SHong Zhang /*20*/ MatAssemblyBegin_SeqDense, 1592c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 1593905e6a2fSBarry Smith 0, 1594905e6a2fSBarry Smith MatSetOption_SeqDense, 1595905e6a2fSBarry Smith MatZeroEntries_SeqDense, 159697304618SKris Buschelman /*25*/ MatZeroRows_SeqDense, 1597905e6a2fSBarry Smith MatLUFactorSymbolic_SeqDense, 1598905e6a2fSBarry Smith MatLUFactorNumeric_SeqDense, 1599905e6a2fSBarry Smith MatCholeskyFactorSymbolic_SeqDense, 1600905e6a2fSBarry Smith MatCholeskyFactorNumeric_SeqDense, 160197304618SKris Buschelman /*30*/ MatSetUpPreallocation_SeqDense, 1602273d9f13SBarry Smith 0, 1603905e6a2fSBarry Smith 0, 1604905e6a2fSBarry Smith MatGetArray_SeqDense, 1605905e6a2fSBarry Smith MatRestoreArray_SeqDense, 160697304618SKris Buschelman /*35*/ MatDuplicate_SeqDense, 1607a5ae1ecdSBarry Smith 0, 1608a5ae1ecdSBarry Smith 0, 1609a5ae1ecdSBarry Smith 0, 1610a5ae1ecdSBarry Smith 0, 161197304618SKris Buschelman /*40*/ MatAXPY_SeqDense, 1612a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 1613a5ae1ecdSBarry Smith 0, 16144b0e389bSBarry Smith MatGetValues_SeqDense, 1615a5ae1ecdSBarry Smith MatCopy_SeqDense, 161697304618SKris Buschelman /*45*/ 0, 1617a5ae1ecdSBarry Smith MatScale_SeqDense, 1618a5ae1ecdSBarry Smith 0, 1619a5ae1ecdSBarry Smith 0, 1620a5ae1ecdSBarry Smith 0, 1621521d7252SBarry Smith /*50*/ 0, 1622a5ae1ecdSBarry Smith 0, 1623a5ae1ecdSBarry Smith 0, 1624a5ae1ecdSBarry Smith 0, 1625a5ae1ecdSBarry Smith 0, 162697304618SKris Buschelman /*55*/ 0, 1627a5ae1ecdSBarry Smith 0, 1628a5ae1ecdSBarry Smith 0, 1629a5ae1ecdSBarry Smith 0, 1630a5ae1ecdSBarry Smith 0, 163197304618SKris Buschelman /*60*/ 0, 1632e03a110bSBarry Smith MatDestroy_SeqDense, 1633e03a110bSBarry Smith MatView_SeqDense, 1634357abbc8SBarry Smith 0, 163597304618SKris Buschelman 0, 163697304618SKris Buschelman /*65*/ 0, 163797304618SKris Buschelman 0, 163897304618SKris Buschelman 0, 163997304618SKris Buschelman 0, 164097304618SKris Buschelman 0, 164197304618SKris Buschelman /*70*/ 0, 164297304618SKris Buschelman 0, 164397304618SKris Buschelman 0, 164497304618SKris Buschelman 0, 164597304618SKris Buschelman 0, 164697304618SKris Buschelman /*75*/ 0, 164797304618SKris Buschelman 0, 164897304618SKris Buschelman 0, 164997304618SKris Buschelman 0, 165097304618SKris Buschelman 0, 165197304618SKris Buschelman /*80*/ 0, 165297304618SKris Buschelman 0, 165397304618SKris Buschelman 0, 165497304618SKris Buschelman 0, 1655865e5f61SKris Buschelman /*84*/ MatLoad_SeqDense, 1656865e5f61SKris Buschelman 0, 1657865e5f61SKris Buschelman 0, 1658865e5f61SKris Buschelman 0, 1659865e5f61SKris Buschelman 0, 1660865e5f61SKris Buschelman 0, 1661a9fe9ddaSSatish Balay /*90*/ MatMatMult_SeqDense_SeqDense, 1662a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 1663a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 1664865e5f61SKris Buschelman 0, 1665865e5f61SKris Buschelman 0, 1666865e5f61SKris Buschelman /*95*/ 0, 1667a9fe9ddaSSatish Balay MatMatMultTranspose_SeqDense_SeqDense, 1668a9fe9ddaSSatish Balay MatMatMultTransposeSymbolic_SeqDense_SeqDense, 1669a9fe9ddaSSatish Balay MatMatMultTransposeNumeric_SeqDense_SeqDense, 1670284134d9SBarry Smith 0, 1671284134d9SBarry Smith /*100*/0, 1672284134d9SBarry Smith 0, 1673284134d9SBarry Smith 0, 1674284134d9SBarry Smith 0, 1675284134d9SBarry Smith MatSetSizes_SeqDense}; 167690ace30eSBarry Smith 16774a2ae208SSatish Balay #undef __FUNCT__ 16784a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 16794b828684SBarry Smith /*@C 1680fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 1681d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 1682d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 1683289bc588SBarry Smith 1684db81eaa0SLois Curfman McInnes Collective on MPI_Comm 1685db81eaa0SLois Curfman McInnes 168620563c6bSBarry Smith Input Parameters: 1687db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 16880c775827SLois Curfman McInnes . m - number of rows 168918f449edSLois Curfman McInnes . n - number of columns 1690db81eaa0SLois Curfman McInnes - data - optional location of matrix data. Set data=PETSC_NULL for PETSc 1691dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 169220563c6bSBarry Smith 169320563c6bSBarry Smith Output Parameter: 169444cd7ae7SLois Curfman McInnes . A - the matrix 169520563c6bSBarry Smith 1696b259b22eSLois Curfman McInnes Notes: 169718f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 169818f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 1699b4fd4287SBarry Smith set data=PETSC_NULL. 170018f449edSLois Curfman McInnes 1701027ccd11SLois Curfman McInnes Level: intermediate 1702027ccd11SLois Curfman McInnes 1703dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 1704d65003e9SLois Curfman McInnes 1705db81eaa0SLois Curfman McInnes .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues() 170620563c6bSBarry Smith @*/ 1707be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 1708289bc588SBarry Smith { 1709dfbe8321SBarry Smith PetscErrorCode ierr; 17103b2fbd54SBarry Smith 17113a40ed3dSBarry Smith PetscFunctionBegin; 1712f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 1713f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 1714273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 1715273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 1716273d9f13SBarry Smith PetscFunctionReturn(0); 1717273d9f13SBarry Smith } 1718273d9f13SBarry Smith 17194a2ae208SSatish Balay #undef __FUNCT__ 17204a2ae208SSatish Balay #define __FUNCT__ "MatSeqDensePreallocation" 1721273d9f13SBarry Smith /*@C 1722273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 1723273d9f13SBarry Smith 1724273d9f13SBarry Smith Collective on MPI_Comm 1725273d9f13SBarry Smith 1726273d9f13SBarry Smith Input Parameters: 1727273d9f13SBarry Smith + A - the matrix 1728273d9f13SBarry Smith - data - the array (or PETSC_NULL) 1729273d9f13SBarry Smith 1730273d9f13SBarry Smith Notes: 1731273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 1732273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 1733284134d9SBarry Smith need not call this routine. 1734273d9f13SBarry Smith 1735273d9f13SBarry Smith Level: intermediate 1736273d9f13SBarry Smith 1737273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 1738273d9f13SBarry Smith 1739273d9f13SBarry Smith .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues() 1740273d9f13SBarry Smith @*/ 1741be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 1742273d9f13SBarry Smith { 1743dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(Mat,PetscScalar[]); 1744a23d5eceSKris Buschelman 1745a23d5eceSKris Buschelman PetscFunctionBegin; 1746a23d5eceSKris Buschelman ierr = PetscObjectQueryFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",(void (**)(void))&f);CHKERRQ(ierr); 1747a23d5eceSKris Buschelman if (f) { 1748a23d5eceSKris Buschelman ierr = (*f)(B,data);CHKERRQ(ierr); 1749a23d5eceSKris Buschelman } 1750a23d5eceSKris Buschelman PetscFunctionReturn(0); 1751a23d5eceSKris Buschelman } 1752a23d5eceSKris Buschelman 1753a23d5eceSKris Buschelman EXTERN_C_BEGIN 1754a23d5eceSKris Buschelman #undef __FUNCT__ 1755a23d5eceSKris Buschelman #define __FUNCT__ "MatSeqDensePreallocation_SeqDense" 1756be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 1757a23d5eceSKris Buschelman { 1758273d9f13SBarry Smith Mat_SeqDense *b; 1759dfbe8321SBarry Smith PetscErrorCode ierr; 1760273d9f13SBarry Smith 1761273d9f13SBarry Smith PetscFunctionBegin; 1762273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 1763273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 1764273d9f13SBarry Smith if (!data) { 1765284134d9SBarry Smith ierr = PetscMalloc((b->lda*b->Nmax+1)*sizeof(PetscScalar),&b->v);CHKERRQ(ierr); 1766284134d9SBarry Smith ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 1767273d9f13SBarry Smith b->user_alloc = PETSC_FALSE; 1768284134d9SBarry Smith ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 1769273d9f13SBarry Smith } else { /* user-allocated storage */ 1770273d9f13SBarry Smith b->v = data; 1771273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 1772273d9f13SBarry Smith } 1773273d9f13SBarry Smith PetscFunctionReturn(0); 1774273d9f13SBarry Smith } 1775a23d5eceSKris Buschelman EXTERN_C_END 1776273d9f13SBarry Smith 17771b807ce4Svictorle #undef __FUNCT__ 17781b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 17791b807ce4Svictorle /*@C 17801b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 17811b807ce4Svictorle 17821b807ce4Svictorle Input parameter: 17831b807ce4Svictorle + A - the matrix 17841b807ce4Svictorle - lda - the leading dimension 17851b807ce4Svictorle 17861b807ce4Svictorle Notes: 17871b807ce4Svictorle This routine is to be used in conjunction with MatSeqDenseSetPreallocation; 17881b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 17891b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 17901b807ce4Svictorle 17911b807ce4Svictorle Level: intermediate 17921b807ce4Svictorle 17931b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 17941b807ce4Svictorle 1795284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 17961b807ce4Svictorle @*/ 1797be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetLDA(Mat B,PetscInt lda) 17981b807ce4Svictorle { 17991b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 180021a2c019SBarry Smith 18011b807ce4Svictorle PetscFunctionBegin; 1802899cda47SBarry Smith if (lda < B->rmap.n) SETERRQ2(PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->rmap.n); 18031b807ce4Svictorle b->lda = lda; 180421a2c019SBarry Smith b->changelda = PETSC_FALSE; 180521a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 18061b807ce4Svictorle PetscFunctionReturn(0); 18071b807ce4Svictorle } 18081b807ce4Svictorle 18090bad9183SKris Buschelman /*MC 1810fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 18110bad9183SKris Buschelman 18120bad9183SKris Buschelman Options Database Keys: 18130bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 18140bad9183SKris Buschelman 18150bad9183SKris Buschelman Level: beginner 18160bad9183SKris Buschelman 181789665df3SBarry Smith .seealso: MatCreateSeqDense() 181889665df3SBarry Smith 18190bad9183SKris Buschelman M*/ 18200bad9183SKris Buschelman 1821273d9f13SBarry Smith EXTERN_C_BEGIN 18224a2ae208SSatish Balay #undef __FUNCT__ 18234a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 1824be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreate_SeqDense(Mat B) 1825273d9f13SBarry Smith { 1826273d9f13SBarry Smith Mat_SeqDense *b; 1827dfbe8321SBarry Smith PetscErrorCode ierr; 18287c334f02SBarry Smith PetscMPIInt size; 1829273d9f13SBarry Smith 1830273d9f13SBarry Smith PetscFunctionBegin; 1831273d9f13SBarry Smith ierr = MPI_Comm_size(B->comm,&size);CHKERRQ(ierr); 183229bbc08cSBarry Smith if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 183355659b69SBarry Smith 1834899cda47SBarry Smith B->rmap.bs = B->cmap.bs = 1; 1835899cda47SBarry Smith ierr = PetscMapInitialize(B->comm,&B->rmap);CHKERRQ(ierr); 1836899cda47SBarry Smith ierr = PetscMapInitialize(B->comm,&B->cmap);CHKERRQ(ierr); 1837273d9f13SBarry Smith 1838b0a32e0cSBarry Smith ierr = PetscNew(Mat_SeqDense,&b);CHKERRQ(ierr); 1839549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 184044cd7ae7SLois Curfman McInnes B->factor = 0; 184190f02eecSBarry Smith B->mapping = 0; 184252e6d16bSBarry Smith ierr = PetscLogObjectMemory(B,sizeof(struct _p_Mat));CHKERRQ(ierr); 184344cd7ae7SLois Curfman McInnes B->data = (void*)b; 184418f449edSLois Curfman McInnes 1845a5ae1ecdSBarry Smith 184644cd7ae7SLois Curfman McInnes b->pivots = 0; 1847273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 1848273d9f13SBarry Smith b->v = 0; 1849899cda47SBarry Smith b->lda = B->rmap.n; 185021a2c019SBarry Smith b->changelda = PETSC_FALSE; 1851899cda47SBarry Smith b->Mmax = B->rmap.n; 1852899cda47SBarry Smith b->Nmax = B->cmap.n; 18534e220ebcSLois Curfman McInnes 1854a23d5eceSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C", 1855a23d5eceSKris Buschelman "MatSeqDenseSetPreallocation_SeqDense", 1856a23d5eceSKris Buschelman MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 18573a40ed3dSBarry Smith PetscFunctionReturn(0); 1858289bc588SBarry Smith } 1859c0aa2d19SHong Zhang 1860c0aa2d19SHong Zhang 1861273d9f13SBarry Smith EXTERN_C_END 1862