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; 174ce68768SBarry Smith PetscBLASInt N = (PetscBLASInt)X->m*X->n,m=(PetscBLASInt)X->m,ldax = x->lda,lday=y->lda,one = 1; 18efee365bSSatish Balay PetscErrorCode ierr; 193a40ed3dSBarry Smith 203a40ed3dSBarry Smith PetscFunctionBegin; 21f4df32b1SMatthew Knepley if (X->m != Y->m || X->n != Y->n) SETERRQ(PETSC_ERR_ARG_SIZ,"size(X) != size(Y)"); 22a5ce6ee0Svictorle if (ldax>m || lday>m) { 23a5ce6ee0Svictorle for (j=0; j<X->n; j++) { 24f4df32b1SMatthew Knepley BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one); 25a5ce6ee0Svictorle } 26a5ce6ee0Svictorle } else { 27f4df32b1SMatthew Knepley BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one); 28a5ce6ee0Svictorle } 29efee365bSSatish Balay ierr = PetscLogFlops(2*N-1);CHKERRQ(ierr); 303a40ed3dSBarry Smith PetscFunctionReturn(0); 311987afe7SBarry Smith } 321987afe7SBarry Smith 334a2ae208SSatish Balay #undef __FUNCT__ 344a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense" 35dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info) 36289bc588SBarry Smith { 376de62eeeSBarry Smith PetscInt N = A->m*A->n; 383a40ed3dSBarry Smith 393a40ed3dSBarry Smith PetscFunctionBegin; 40273d9f13SBarry Smith info->rows_global = (double)A->m; 41273d9f13SBarry Smith info->columns_global = (double)A->n; 42273d9f13SBarry Smith info->rows_local = (double)A->m; 43273d9f13SBarry Smith info->columns_local = (double)A->n; 444e220ebcSLois Curfman McInnes info->block_size = 1.0; 454e220ebcSLois Curfman McInnes info->nz_allocated = (double)N; 466de62eeeSBarry Smith info->nz_used = (double)N; 476de62eeeSBarry Smith info->nz_unneeded = (double)0; 484e220ebcSLois Curfman McInnes info->assemblies = (double)A->num_ass; 494e220ebcSLois Curfman McInnes info->mallocs = 0; 504e220ebcSLois Curfman McInnes info->memory = A->mem; 514e220ebcSLois Curfman McInnes info->fill_ratio_given = 0; 524e220ebcSLois Curfman McInnes info->fill_ratio_needed = 0; 534e220ebcSLois Curfman McInnes info->factor_mallocs = 0; 543a40ed3dSBarry Smith PetscFunctionReturn(0); 55289bc588SBarry Smith } 56289bc588SBarry Smith 574a2ae208SSatish Balay #undef __FUNCT__ 584a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense" 59f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha) 6080cd9d93SLois Curfman McInnes { 61273d9f13SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 62f4df32b1SMatthew Knepley PetscScalar oalpha = alpha; 634ce68768SBarry Smith PetscBLASInt one = 1,lda = a->lda,j,nz; 64efee365bSSatish Balay PetscErrorCode ierr; 6580cd9d93SLois Curfman McInnes 663a40ed3dSBarry Smith PetscFunctionBegin; 67a5ce6ee0Svictorle if (lda>A->m) { 684ce68768SBarry Smith nz = (PetscBLASInt)A->m; 69a5ce6ee0Svictorle for (j=0; j<A->n; j++) { 70f4df32b1SMatthew Knepley BLASscal_(&nz,&oalpha,a->v+j*lda,&one); 71a5ce6ee0Svictorle } 72a5ce6ee0Svictorle } else { 734ce68768SBarry Smith nz = (PetscBLASInt)A->m*A->n; 74f4df32b1SMatthew Knepley BLASscal_(&nz,&oalpha,a->v,&one); 75a5ce6ee0Svictorle } 76efee365bSSatish Balay ierr = PetscLogFlops(nz);CHKERRQ(ierr); 773a40ed3dSBarry Smith PetscFunctionReturn(0); 7880cd9d93SLois Curfman McInnes } 7980cd9d93SLois Curfman McInnes 80289bc588SBarry Smith /* ---------------------------------------------------------------*/ 816831982aSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots, 826831982aSBarry Smith rather than put it in the Mat->row slot.*/ 834a2ae208SSatish Balay #undef __FUNCT__ 844a2ae208SSatish Balay #define __FUNCT__ "MatLUFactor_SeqDense" 85dfbe8321SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,MatFactorInfo *minfo) 86289bc588SBarry Smith { 87a07ab388SBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF) 8881f479a6Svictorle PetscFunctionBegin; 89a07ab388SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable."); 90a07ab388SBarry Smith #else 91c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 926849ba73SBarry Smith PetscErrorCode ierr; 934ce68768SBarry Smith PetscBLASInt n = (PetscBLASInt)A->n,m = (PetscBLASInt)A->m,info; 9455659b69SBarry Smith 953a40ed3dSBarry Smith PetscFunctionBegin; 96289bc588SBarry Smith if (!mat->pivots) { 974ce68768SBarry Smith ierr = PetscMalloc((A->m+1)*sizeof(PetscBLASInt),&mat->pivots);CHKERRQ(ierr); 9852e6d16bSBarry Smith ierr = PetscLogObjectMemory(A,A->m*sizeof(PetscBLASInt));CHKERRQ(ierr); 99289bc588SBarry Smith } 100f1af5d2fSBarry Smith A->factor = FACTOR_LU; 101273d9f13SBarry Smith if (!A->m || !A->n) PetscFunctionReturn(0); 10271044d3cSBarry Smith LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info); 10329bbc08cSBarry Smith if (info<0) SETERRQ(PETSC_ERR_LIB,"Bad argument to LU factorization"); 10429bbc08cSBarry Smith if (info>0) SETERRQ(PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization"); 105efee365bSSatish Balay ierr = PetscLogFlops((2*A->n*A->n*A->n)/3);CHKERRQ(ierr); 106a07ab388SBarry Smith #endif 1073a40ed3dSBarry Smith PetscFunctionReturn(0); 108289bc588SBarry Smith } 1096ee01492SSatish Balay 1104a2ae208SSatish Balay #undef __FUNCT__ 1114a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense" 112dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat) 11302cad45dSBarry Smith { 11402cad45dSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l; 1156849ba73SBarry Smith PetscErrorCode ierr; 11613f74950SBarry Smith PetscInt lda = (PetscInt)mat->lda,j,m; 11702cad45dSBarry Smith Mat newi; 11802cad45dSBarry Smith 1193a40ed3dSBarry Smith PetscFunctionBegin; 120f69a0ea3SMatthew Knepley ierr = MatCreate(A->comm,&newi);CHKERRQ(ierr); 121f69a0ea3SMatthew Knepley ierr = MatSetSizes(newi,A->m,A->n,A->m,A->n);CHKERRQ(ierr); 1225c5985e7SKris Buschelman ierr = MatSetType(newi,A->type_name);CHKERRQ(ierr); 1235c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(newi,PETSC_NULL);CHKERRQ(ierr); 1245609ef8eSBarry Smith if (cpvalues == MAT_COPY_VALUES) { 125a5ce6ee0Svictorle l = (Mat_SeqDense*)newi->data; 126a5ce6ee0Svictorle if (lda>A->m) { 127a5ce6ee0Svictorle m = A->m; 128a5ce6ee0Svictorle for (j=0; j<A->n; j++) { 129a5ce6ee0Svictorle ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 130a5ce6ee0Svictorle } 131a5ce6ee0Svictorle } else { 13287828ca2SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->m*A->n*sizeof(PetscScalar));CHKERRQ(ierr); 13302cad45dSBarry Smith } 134a5ce6ee0Svictorle } 13502cad45dSBarry Smith newi->assembled = PETSC_TRUE; 13602cad45dSBarry Smith *newmat = newi; 1373a40ed3dSBarry Smith PetscFunctionReturn(0); 13802cad45dSBarry Smith } 13902cad45dSBarry Smith 1404a2ae208SSatish Balay #undef __FUNCT__ 1414a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorSymbolic_SeqDense" 142dfbe8321SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat A,IS row,IS col,MatFactorInfo *info,Mat *fact) 143289bc588SBarry Smith { 144dfbe8321SBarry Smith PetscErrorCode ierr; 1453a40ed3dSBarry Smith 1463a40ed3dSBarry Smith PetscFunctionBegin; 1475609ef8eSBarry Smith ierr = MatDuplicate_SeqDense(A,MAT_DO_NOT_COPY_VALUES,fact);CHKERRQ(ierr); 1483a40ed3dSBarry Smith PetscFunctionReturn(0); 149289bc588SBarry Smith } 1506ee01492SSatish Balay 1514a2ae208SSatish Balay #undef __FUNCT__ 1524a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense" 153af281ebdSHong Zhang PetscErrorCode MatLUFactorNumeric_SeqDense(Mat A,MatFactorInfo *info_dummy,Mat *fact) 154289bc588SBarry Smith { 15502cad45dSBarry Smith Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l = (Mat_SeqDense*)(*fact)->data; 1566849ba73SBarry Smith PetscErrorCode ierr; 15713f74950SBarry Smith PetscInt lda1=mat->lda,lda2=l->lda, m=A->m,n=A->n, j; 1584482741eSBarry Smith MatFactorInfo info; 1593a40ed3dSBarry Smith 1603a40ed3dSBarry Smith PetscFunctionBegin; 16102cad45dSBarry Smith /* copy the numerical values */ 1621b807ce4Svictorle if (lda1>m || lda2>m ) { 1631b807ce4Svictorle for (j=0; j<n; j++) { 1641b807ce4Svictorle ierr = PetscMemcpy(l->v+j*lda2,mat->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1651b807ce4Svictorle } 1661b807ce4Svictorle } else { 16787828ca2SBarry Smith ierr = PetscMemcpy(l->v,mat->v,A->m*A->n*sizeof(PetscScalar));CHKERRQ(ierr); 1681b807ce4Svictorle } 16902cad45dSBarry Smith (*fact)->factor = 0; 1704482741eSBarry Smith ierr = MatLUFactor(*fact,0,0,&info);CHKERRQ(ierr); 1713a40ed3dSBarry Smith PetscFunctionReturn(0); 172289bc588SBarry Smith } 1736ee01492SSatish Balay 1744a2ae208SSatish Balay #undef __FUNCT__ 1754a2ae208SSatish Balay #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense" 176dfbe8321SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat A,IS row,MatFactorInfo *info,Mat *fact) 177289bc588SBarry Smith { 178dfbe8321SBarry Smith PetscErrorCode ierr; 1793a40ed3dSBarry Smith 1803a40ed3dSBarry Smith PetscFunctionBegin; 181ceb03754SKris Buschelman ierr = MatConvert(A,MATSAME,MAT_INITIAL_MATRIX,fact);CHKERRQ(ierr); 1823a40ed3dSBarry Smith PetscFunctionReturn(0); 183289bc588SBarry Smith } 1846ee01492SSatish Balay 1854a2ae208SSatish Balay #undef __FUNCT__ 1864a2ae208SSatish Balay #define __FUNCT__ "MatCholeskyFactor_SeqDense" 187dfbe8321SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,MatFactorInfo *factinfo) 188289bc588SBarry Smith { 189a07ab388SBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF) 190a07ab388SBarry Smith PetscFunctionBegin; 191a07ab388SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable."); 192a07ab388SBarry Smith #else 193c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1946849ba73SBarry Smith PetscErrorCode ierr; 1954ce68768SBarry Smith PetscBLASInt n = (PetscBLASInt)A->n,info; 19655659b69SBarry Smith 1973a40ed3dSBarry Smith PetscFunctionBegin; 198752f5567SLois Curfman McInnes if (mat->pivots) { 199606d414cSSatish Balay ierr = PetscFree(mat->pivots);CHKERRQ(ierr); 20052e6d16bSBarry Smith ierr = PetscLogObjectMemory(A,-A->m*sizeof(PetscInt));CHKERRQ(ierr); 201752f5567SLois Curfman McInnes mat->pivots = 0; 202752f5567SLois Curfman McInnes } 203273d9f13SBarry Smith if (!A->m || !A->n) PetscFunctionReturn(0); 20471044d3cSBarry Smith LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info); 20577431f27SBarry Smith if (info) SETERRQ1(PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1); 206c0bbcb79SLois Curfman McInnes A->factor = FACTOR_CHOLESKY; 207efee365bSSatish Balay ierr = PetscLogFlops((A->n*A->n*A->n)/3);CHKERRQ(ierr); 208a07ab388SBarry Smith #endif 2093a40ed3dSBarry Smith PetscFunctionReturn(0); 210289bc588SBarry Smith } 211289bc588SBarry Smith 2124a2ae208SSatish Balay #undef __FUNCT__ 2130b4b3355SBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense" 214af281ebdSHong Zhang PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat A,MatFactorInfo *info_dummy,Mat *fact) 2150b4b3355SBarry Smith { 216dfbe8321SBarry Smith PetscErrorCode ierr; 21715e8a5b3SHong Zhang MatFactorInfo info; 2180b4b3355SBarry Smith 2190b4b3355SBarry Smith PetscFunctionBegin; 22015e8a5b3SHong Zhang info.fill = 1.0; 22115e8a5b3SHong Zhang ierr = MatCholeskyFactor_SeqDense(*fact,0,&info);CHKERRQ(ierr); 2220b4b3355SBarry Smith PetscFunctionReturn(0); 2230b4b3355SBarry Smith } 2240b4b3355SBarry Smith 2250b4b3355SBarry Smith #undef __FUNCT__ 2264a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense" 227dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy) 228289bc588SBarry Smith { 229c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 2306849ba73SBarry Smith PetscErrorCode ierr; 2314ce68768SBarry Smith PetscBLASInt m = (PetscBLASInt)A->m, one = 1,info; 23287828ca2SBarry Smith PetscScalar *x,*y; 23367e560aaSBarry Smith 2343a40ed3dSBarry Smith PetscFunctionBegin; 235273d9f13SBarry Smith if (!A->m || !A->n) PetscFunctionReturn(0); 2361ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2371ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 23887828ca2SBarry Smith ierr = PetscMemcpy(y,x,A->m*sizeof(PetscScalar));CHKERRQ(ierr); 239c0bbcb79SLois Curfman McInnes if (A->factor == FACTOR_LU) { 240ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 24180444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 242ae7cfcebSSatish Balay #else 24371044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 2444ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"GETRS - Bad solve"); 245ae7cfcebSSatish Balay #endif 2467a97a34bSBarry Smith } else if (A->factor == FACTOR_CHOLESKY){ 247ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 24880444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 249ae7cfcebSSatish Balay #else 25071044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 2514ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS Bad solve"); 252ae7cfcebSSatish Balay #endif 253289bc588SBarry Smith } 25429bbc08cSBarry Smith else SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve"); 2551ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2561ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 257efee365bSSatish Balay ierr = PetscLogFlops(2*A->n*A->n - A->n);CHKERRQ(ierr); 2583a40ed3dSBarry Smith PetscFunctionReturn(0); 259289bc588SBarry Smith } 2606ee01492SSatish Balay 2614a2ae208SSatish Balay #undef __FUNCT__ 2624a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense" 263dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy) 264da3a660dSBarry Smith { 265c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 266dfbe8321SBarry Smith PetscErrorCode ierr; 2674ce68768SBarry Smith PetscBLASInt m = (PetscBLASInt) A->m,one = 1,info; 26887828ca2SBarry Smith PetscScalar *x,*y; 26967e560aaSBarry Smith 2703a40ed3dSBarry Smith PetscFunctionBegin; 271273d9f13SBarry Smith if (!A->m || !A->n) PetscFunctionReturn(0); 2721ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 2731ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 27487828ca2SBarry Smith ierr = PetscMemcpy(y,x,A->m*sizeof(PetscScalar));CHKERRQ(ierr); 275752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 276da3a660dSBarry Smith if (mat->pivots) { 277ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 27880444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 279ae7cfcebSSatish Balay #else 28071044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 2814ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS - Bad solve"); 282ae7cfcebSSatish Balay #endif 2837a97a34bSBarry Smith } else { 284ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 28580444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 286ae7cfcebSSatish Balay #else 28771044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 2884ce68768SBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"POTRS - Bad solve"); 289ae7cfcebSSatish Balay #endif 290da3a660dSBarry Smith } 2911ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 2921ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 293efee365bSSatish Balay ierr = PetscLogFlops(2*A->n*A->n - A->n);CHKERRQ(ierr); 2943a40ed3dSBarry Smith PetscFunctionReturn(0); 295da3a660dSBarry Smith } 2966ee01492SSatish Balay 2974a2ae208SSatish Balay #undef __FUNCT__ 2984a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense" 299dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 300da3a660dSBarry Smith { 301c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 302dfbe8321SBarry Smith PetscErrorCode ierr; 3034ce68768SBarry Smith PetscBLASInt m = (PetscBLASInt)A->m,one = 1,info; 30487828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 305da3a660dSBarry Smith Vec tmp = 0; 30667e560aaSBarry Smith 3073a40ed3dSBarry Smith PetscFunctionBegin; 3081ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 3091ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 310273d9f13SBarry Smith if (!A->m || !A->n) PetscFunctionReturn(0); 311da3a660dSBarry Smith if (yy == zz) { 31278b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 31352e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 31478b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 315da3a660dSBarry Smith } 31687828ca2SBarry Smith ierr = PetscMemcpy(y,x,A->m*sizeof(PetscScalar));CHKERRQ(ierr); 317752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 318da3a660dSBarry Smith if (mat->pivots) { 319ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 32080444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 321ae7cfcebSSatish Balay #else 32271044d3cSBarry Smith LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 3232ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 324ae7cfcebSSatish Balay #endif 325a8c6a408SBarry Smith } else { 326ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 32780444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 328ae7cfcebSSatish Balay #else 32971044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 3302ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 331ae7cfcebSSatish Balay #endif 332da3a660dSBarry Smith } 3332dcb1b2aSMatthew Knepley if (tmp) {ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); ierr = VecDestroy(tmp);CHKERRQ(ierr);} 3342dcb1b2aSMatthew Knepley else {ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);} 3351ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3361ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 337efee365bSSatish Balay ierr = PetscLogFlops(2*A->n*A->n);CHKERRQ(ierr); 3383a40ed3dSBarry Smith PetscFunctionReturn(0); 339da3a660dSBarry Smith } 34067e560aaSBarry Smith 3414a2ae208SSatish Balay #undef __FUNCT__ 3424a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense" 343dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 344da3a660dSBarry Smith { 345c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 3466849ba73SBarry Smith PetscErrorCode ierr; 3474ce68768SBarry Smith PetscBLASInt m = (PetscBLASInt)A->m,one = 1,info; 34887828ca2SBarry Smith PetscScalar *x,*y,sone = 1.0; 349da3a660dSBarry Smith Vec tmp; 35067e560aaSBarry Smith 3513a40ed3dSBarry Smith PetscFunctionBegin; 352273d9f13SBarry Smith if (!A->m || !A->n) PetscFunctionReturn(0); 3531ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 3541ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 355da3a660dSBarry Smith if (yy == zz) { 35678b31e54SBarry Smith ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr); 35752e6d16bSBarry Smith ierr = PetscLogObjectParent(A,tmp);CHKERRQ(ierr); 35878b31e54SBarry Smith ierr = VecCopy(yy,tmp);CHKERRQ(ierr); 359da3a660dSBarry Smith } 36087828ca2SBarry Smith ierr = PetscMemcpy(y,x,A->m*sizeof(PetscScalar));CHKERRQ(ierr); 361752f5567SLois Curfman McInnes /* assume if pivots exist then use LU; else Cholesky */ 362da3a660dSBarry Smith if (mat->pivots) { 363ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS) 36480444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable."); 365ae7cfcebSSatish Balay #else 36671044d3cSBarry Smith LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info); 3672ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 368ae7cfcebSSatish Balay #endif 3693a40ed3dSBarry Smith } else { 370ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS) 37180444007SBarry Smith SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable."); 372ae7cfcebSSatish Balay #else 37371044d3cSBarry Smith LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info); 3742ffef20aSBarry Smith if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve"); 375ae7cfcebSSatish Balay #endif 376da3a660dSBarry Smith } 37790f02eecSBarry Smith if (tmp) { 3782dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr); 37990f02eecSBarry Smith ierr = VecDestroy(tmp);CHKERRQ(ierr); 3803a40ed3dSBarry Smith } else { 3812dcb1b2aSMatthew Knepley ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr); 38290f02eecSBarry Smith } 3831ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 3841ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 385efee365bSSatish Balay ierr = PetscLogFlops(2*A->n*A->n);CHKERRQ(ierr); 3863a40ed3dSBarry Smith PetscFunctionReturn(0); 387da3a660dSBarry Smith } 388289bc588SBarry Smith /* ------------------------------------------------------------------*/ 3894a2ae208SSatish Balay #undef __FUNCT__ 3904a2ae208SSatish Balay #define __FUNCT__ "MatRelax_SeqDense" 39113f74950SBarry Smith PetscErrorCode MatRelax_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx) 392289bc588SBarry Smith { 393c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 39487828ca2SBarry Smith PetscScalar *x,*b,*v = mat->v,zero = 0.0,xt; 395dfbe8321SBarry Smith PetscErrorCode ierr; 39613f74950SBarry Smith PetscInt m = A->m,i; 397aa482453SBarry Smith #if !defined(PETSC_USE_COMPLEX) 3984ce68768SBarry Smith PetscBLASInt bm = (PetscBLASInt)m, o = 1; 399bc1b551cSSatish Balay #endif 400289bc588SBarry Smith 4013a40ed3dSBarry Smith PetscFunctionBegin; 402289bc588SBarry Smith if (flag & SOR_ZERO_INITIAL_GUESS) { 40371044d3cSBarry Smith /* this is a hack fix, should have another version without the second BLASdot */ 4042dcb1b2aSMatthew Knepley ierr = VecSet(xx,zero);CHKERRQ(ierr); 405289bc588SBarry Smith } 4061ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 4071ebc52fbSHong Zhang ierr = VecGetArray(bb,&b);CHKERRQ(ierr); 408b965ef7fSBarry Smith its = its*lits; 40977431f27SBarry Smith if (its <= 0) SETERRQ2(PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits); 410289bc588SBarry Smith while (its--) { 411fccaa45eSBarry Smith if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP){ 412289bc588SBarry Smith for (i=0; i<m; i++) { 413aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 414f1747703SBarry Smith /* cannot use BLAS dot for complex because compiler/linker is 415f1747703SBarry Smith not happy about returning a double complex */ 41613f74950SBarry Smith PetscInt _i; 41787828ca2SBarry Smith PetscScalar sum = b[i]; 418f1747703SBarry Smith for (_i=0; _i<m; _i++) { 4193f6de6efSSatish Balay sum -= PetscConj(v[i+_i*m])*x[_i]; 420f1747703SBarry Smith } 421f1747703SBarry Smith xt = sum; 422f1747703SBarry Smith #else 42371044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 424f1747703SBarry Smith #endif 42555a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 426289bc588SBarry Smith } 427289bc588SBarry Smith } 428fccaa45eSBarry Smith if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP){ 429289bc588SBarry Smith for (i=m-1; i>=0; i--) { 430aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 431f1747703SBarry Smith /* cannot use BLAS dot for complex because compiler/linker is 432f1747703SBarry Smith not happy about returning a double complex */ 43313f74950SBarry Smith PetscInt _i; 43487828ca2SBarry Smith PetscScalar sum = b[i]; 435f1747703SBarry Smith for (_i=0; _i<m; _i++) { 4363f6de6efSSatish Balay sum -= PetscConj(v[i+_i*m])*x[_i]; 437f1747703SBarry Smith } 438f1747703SBarry Smith xt = sum; 439f1747703SBarry Smith #else 44071044d3cSBarry Smith xt = b[i] - BLASdot_(&bm,v+i,&bm,x,&o); 441f1747703SBarry Smith #endif 44255a1b374SBarry Smith x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift); 443289bc588SBarry Smith } 444289bc588SBarry Smith } 445289bc588SBarry Smith } 4461ebc52fbSHong Zhang ierr = VecRestoreArray(bb,&b);CHKERRQ(ierr); 4471ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 4483a40ed3dSBarry Smith PetscFunctionReturn(0); 449289bc588SBarry Smith } 450289bc588SBarry Smith 451289bc588SBarry Smith /* -----------------------------------------------------------------*/ 4524a2ae208SSatish Balay #undef __FUNCT__ 4534a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense" 454dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy) 455289bc588SBarry Smith { 456c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 45787828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 458dfbe8321SBarry Smith PetscErrorCode ierr; 4594ce68768SBarry Smith PetscBLASInt m = (PetscBLASInt)A->m, n = (PetscBLASInt)A->n,_One=1; 460ea709b57SSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 4613a40ed3dSBarry Smith 4623a40ed3dSBarry Smith PetscFunctionBegin; 463273d9f13SBarry Smith if (!A->m || !A->n) PetscFunctionReturn(0); 4641ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 4651ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 46671044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One); 4671ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 4681ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 469efee365bSSatish Balay ierr = PetscLogFlops(2*A->m*A->n - A->n);CHKERRQ(ierr); 4703a40ed3dSBarry Smith PetscFunctionReturn(0); 471289bc588SBarry Smith } 4726ee01492SSatish Balay 4734a2ae208SSatish Balay #undef __FUNCT__ 4744a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense" 475dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy) 476289bc588SBarry Smith { 477c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 47887828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0; 479dfbe8321SBarry Smith PetscErrorCode ierr; 4804ce68768SBarry Smith PetscBLASInt m = (PetscBLASInt)A->m, n = (PetscBLASInt)A->n, _One=1; 4813a40ed3dSBarry Smith 4823a40ed3dSBarry Smith PetscFunctionBegin; 483273d9f13SBarry Smith if (!A->m || !A->n) PetscFunctionReturn(0); 4841ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 4851ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 48671044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One); 4871ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 4881ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 489efee365bSSatish Balay ierr = PetscLogFlops(2*A->m*A->n - A->m);CHKERRQ(ierr); 4903a40ed3dSBarry Smith PetscFunctionReturn(0); 491289bc588SBarry Smith } 4926ee01492SSatish Balay 4934a2ae208SSatish Balay #undef __FUNCT__ 4944a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense" 495dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 496289bc588SBarry Smith { 497c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 49887828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y,_DOne=1.0; 499dfbe8321SBarry Smith PetscErrorCode ierr; 5004ce68768SBarry Smith PetscBLASInt m = (PetscBLASInt)A->m, n = (PetscBLASInt)A->n, _One=1; 5013a40ed3dSBarry Smith 5023a40ed3dSBarry Smith PetscFunctionBegin; 503273d9f13SBarry Smith if (!A->m || !A->n) PetscFunctionReturn(0); 504600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 5051ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5061ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 50771044d3cSBarry Smith BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 5081ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5091ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 510efee365bSSatish Balay ierr = PetscLogFlops(2*A->m*A->n);CHKERRQ(ierr); 5113a40ed3dSBarry Smith PetscFunctionReturn(0); 512289bc588SBarry Smith } 5136ee01492SSatish Balay 5144a2ae208SSatish Balay #undef __FUNCT__ 5154a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense" 516dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy) 517289bc588SBarry Smith { 518c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 51987828ca2SBarry Smith PetscScalar *v = mat->v,*x,*y; 520dfbe8321SBarry Smith PetscErrorCode ierr; 5214ce68768SBarry Smith PetscBLASInt m = (PetscBLASInt)A->m, n = (PetscBLASInt)A->n, _One=1; 52287828ca2SBarry Smith PetscScalar _DOne=1.0; 5233a40ed3dSBarry Smith 5243a40ed3dSBarry Smith PetscFunctionBegin; 525273d9f13SBarry Smith if (!A->m || !A->n) PetscFunctionReturn(0); 526600d6d0bSBarry Smith if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);} 5271ebc52fbSHong Zhang ierr = VecGetArray(xx,&x);CHKERRQ(ierr); 5281ebc52fbSHong Zhang ierr = VecGetArray(yy,&y);CHKERRQ(ierr); 52971044d3cSBarry Smith BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One); 5301ebc52fbSHong Zhang ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr); 5311ebc52fbSHong Zhang ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr); 532efee365bSSatish Balay ierr = PetscLogFlops(2*A->m*A->n);CHKERRQ(ierr); 5333a40ed3dSBarry Smith PetscFunctionReturn(0); 534289bc588SBarry Smith } 535289bc588SBarry Smith 536289bc588SBarry Smith /* -----------------------------------------------------------------*/ 5374a2ae208SSatish Balay #undef __FUNCT__ 5384a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense" 53913f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 540289bc588SBarry Smith { 541c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 54287828ca2SBarry Smith PetscScalar *v; 5436849ba73SBarry Smith PetscErrorCode ierr; 54413f74950SBarry Smith PetscInt i; 54567e560aaSBarry Smith 5463a40ed3dSBarry Smith PetscFunctionBegin; 547273d9f13SBarry Smith *ncols = A->n; 548289bc588SBarry Smith if (cols) { 54913f74950SBarry Smith ierr = PetscMalloc((A->n+1)*sizeof(PetscInt),cols);CHKERRQ(ierr); 550273d9f13SBarry Smith for (i=0; i<A->n; i++) (*cols)[i] = i; 551289bc588SBarry Smith } 552289bc588SBarry Smith if (vals) { 55387828ca2SBarry Smith ierr = PetscMalloc((A->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr); 554289bc588SBarry Smith v = mat->v + row; 5551b807ce4Svictorle for (i=0; i<A->n; i++) {(*vals)[i] = *v; v += mat->lda;} 556289bc588SBarry Smith } 5573a40ed3dSBarry Smith PetscFunctionReturn(0); 558289bc588SBarry Smith } 5596ee01492SSatish Balay 5604a2ae208SSatish Balay #undef __FUNCT__ 5614a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense" 56213f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals) 563289bc588SBarry Smith { 564dfbe8321SBarry Smith PetscErrorCode ierr; 565606d414cSSatish Balay PetscFunctionBegin; 566606d414cSSatish Balay if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);} 567606d414cSSatish Balay if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); } 5683a40ed3dSBarry Smith PetscFunctionReturn(0); 569289bc588SBarry Smith } 570289bc588SBarry Smith /* ----------------------------------------------------------------*/ 5714a2ae208SSatish Balay #undef __FUNCT__ 5724a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense" 57313f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv) 574289bc588SBarry Smith { 575c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 57613f74950SBarry Smith PetscInt i,j,idx=0; 577d6dfbf8fSBarry Smith 5783a40ed3dSBarry Smith PetscFunctionBegin; 579289bc588SBarry Smith if (!mat->roworiented) { 580dbb450caSBarry Smith if (addv == INSERT_VALUES) { 581289bc588SBarry Smith for (j=0; j<n; j++) { 582cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 5832515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 58477431f27SBarry Smith if (indexn[j] >= A->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->n-1); 58558804f6dSBarry Smith #endif 586289bc588SBarry Smith for (i=0; i<m; i++) { 587cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 5882515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 58977431f27SBarry Smith if (indexm[i] >= A->m) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->m-1); 59058804f6dSBarry Smith #endif 591cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 592289bc588SBarry Smith } 593289bc588SBarry Smith } 5943a40ed3dSBarry Smith } else { 595289bc588SBarry Smith for (j=0; j<n; j++) { 596cddbea37SSatish Balay if (indexn[j] < 0) {idx += m; continue;} 5972515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 59877431f27SBarry Smith if (indexn[j] >= A->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->n-1); 59958804f6dSBarry Smith #endif 600289bc588SBarry Smith for (i=0; i<m; i++) { 601cddbea37SSatish Balay if (indexm[i] < 0) {idx++; continue;} 6022515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 60377431f27SBarry Smith if (indexm[i] >= A->m) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->m-1); 60458804f6dSBarry Smith #endif 605cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 606289bc588SBarry Smith } 607289bc588SBarry Smith } 608289bc588SBarry Smith } 6093a40ed3dSBarry Smith } else { 610dbb450caSBarry Smith if (addv == INSERT_VALUES) { 611e8d4e0b9SBarry Smith for (i=0; i<m; i++) { 612cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 6132515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 61477431f27SBarry Smith if (indexm[i] >= A->m) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->m-1); 61558804f6dSBarry Smith #endif 616e8d4e0b9SBarry Smith for (j=0; j<n; j++) { 617cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 6182515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 61977431f27SBarry Smith if (indexn[j] >= A->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->n-1); 62058804f6dSBarry Smith #endif 621cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++]; 622e8d4e0b9SBarry Smith } 623e8d4e0b9SBarry Smith } 6243a40ed3dSBarry Smith } else { 625289bc588SBarry Smith for (i=0; i<m; i++) { 626cddbea37SSatish Balay if (indexm[i] < 0) { idx += n; continue;} 6272515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 62877431f27SBarry Smith if (indexm[i] >= A->m) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->m-1); 62958804f6dSBarry Smith #endif 630289bc588SBarry Smith for (j=0; j<n; j++) { 631cddbea37SSatish Balay if (indexn[j] < 0) { idx++; continue;} 6322515c552SBarry Smith #if defined(PETSC_USE_DEBUG) 63377431f27SBarry Smith if (indexn[j] >= A->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->n-1); 63458804f6dSBarry Smith #endif 635cddbea37SSatish Balay mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++]; 636289bc588SBarry Smith } 637289bc588SBarry Smith } 638289bc588SBarry Smith } 639e8d4e0b9SBarry Smith } 6403a40ed3dSBarry Smith PetscFunctionReturn(0); 641289bc588SBarry Smith } 642e8d4e0b9SBarry Smith 6434a2ae208SSatish Balay #undef __FUNCT__ 6444a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense" 64513f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[]) 646ae80bb75SLois Curfman McInnes { 647ae80bb75SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 64813f74950SBarry Smith PetscInt i,j; 64987828ca2SBarry Smith PetscScalar *vpt = v; 650ae80bb75SLois Curfman McInnes 6513a40ed3dSBarry Smith PetscFunctionBegin; 652ae80bb75SLois Curfman McInnes /* row-oriented output */ 653ae80bb75SLois Curfman McInnes for (i=0; i<m; i++) { 654ae80bb75SLois Curfman McInnes for (j=0; j<n; j++) { 6551b807ce4Svictorle *vpt++ = mat->v[indexn[j]*mat->lda + indexm[i]]; 656ae80bb75SLois Curfman McInnes } 657ae80bb75SLois Curfman McInnes } 6583a40ed3dSBarry Smith PetscFunctionReturn(0); 659ae80bb75SLois Curfman McInnes } 660ae80bb75SLois Curfman McInnes 661289bc588SBarry Smith /* -----------------------------------------------------------------*/ 662289bc588SBarry Smith 663e090d566SSatish Balay #include "petscsys.h" 66488e32edaSLois Curfman McInnes 6654a2ae208SSatish Balay #undef __FUNCT__ 6664a2ae208SSatish Balay #define __FUNCT__ "MatLoad_SeqDense" 667f69a0ea3SMatthew Knepley PetscErrorCode MatLoad_SeqDense(PetscViewer viewer, MatType type,Mat *A) 66888e32edaSLois Curfman McInnes { 66988e32edaSLois Curfman McInnes Mat_SeqDense *a; 67088e32edaSLois Curfman McInnes Mat B; 6716849ba73SBarry Smith PetscErrorCode ierr; 67213f74950SBarry Smith PetscInt *scols,i,j,nz,header[4]; 67313f74950SBarry Smith int fd; 67413f74950SBarry Smith PetscMPIInt size; 67513f74950SBarry Smith PetscInt *rowlengths = 0,M,N,*cols; 67687828ca2SBarry Smith PetscScalar *vals,*svals,*v,*w; 67719bcc07fSBarry Smith MPI_Comm comm = ((PetscObject)viewer)->comm; 67888e32edaSLois Curfman McInnes 6793a40ed3dSBarry Smith PetscFunctionBegin; 680d132466eSBarry Smith ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr); 68129bbc08cSBarry Smith if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"view must have one processor"); 682b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 6830752156aSBarry Smith ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr); 684552e946dSBarry Smith if (header[0] != MAT_FILE_COOKIE) SETERRQ(PETSC_ERR_FILE_UNEXPECTED,"Not matrix object"); 68588e32edaSLois Curfman McInnes M = header[1]; N = header[2]; nz = header[3]; 68688e32edaSLois Curfman McInnes 68790ace30eSBarry Smith if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */ 688f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 689f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,M,N,M,N);CHKERRQ(ierr); 690be5d1d56SKris Buschelman ierr = MatSetType(*A,type);CHKERRQ(ierr); 6915c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(*A,PETSC_NULL);CHKERRQ(ierr); 69290ace30eSBarry Smith B = *A; 69390ace30eSBarry Smith a = (Mat_SeqDense*)B->data; 6944a41a4d3SSatish Balay v = a->v; 6954a41a4d3SSatish Balay /* Allocate some temp space to read in the values and then flip them 6964a41a4d3SSatish Balay from row major to column major */ 697b72907f3SBarry Smith ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr); 69890ace30eSBarry Smith /* read in nonzero values */ 6994a41a4d3SSatish Balay ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr); 7004a41a4d3SSatish Balay /* now flip the values and store them in the matrix*/ 7014a41a4d3SSatish Balay for (j=0; j<N; j++) { 7024a41a4d3SSatish Balay for (i=0; i<M; i++) { 7034a41a4d3SSatish Balay *v++ =w[i*N+j]; 7044a41a4d3SSatish Balay } 7054a41a4d3SSatish Balay } 706606d414cSSatish Balay ierr = PetscFree(w);CHKERRQ(ierr); 7076d4a8577SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 7086d4a8577SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 70990ace30eSBarry Smith } else { 71088e32edaSLois Curfman McInnes /* read row lengths */ 71113f74950SBarry Smith ierr = PetscMalloc((M+1)*sizeof(PetscInt),&rowlengths);CHKERRQ(ierr); 7120752156aSBarry Smith ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr); 71388e32edaSLois Curfman McInnes 71488e32edaSLois Curfman McInnes /* create our matrix */ 715f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 716f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,M,N,M,N);CHKERRQ(ierr); 717be5d1d56SKris Buschelman ierr = MatSetType(*A,type);CHKERRQ(ierr); 7185c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(*A,PETSC_NULL);CHKERRQ(ierr); 71988e32edaSLois Curfman McInnes B = *A; 72088e32edaSLois Curfman McInnes a = (Mat_SeqDense*)B->data; 72188e32edaSLois Curfman McInnes v = a->v; 72288e32edaSLois Curfman McInnes 72388e32edaSLois Curfman McInnes /* read column indices and nonzeros */ 72413f74950SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscInt),&scols);CHKERRQ(ierr); 725b0a32e0cSBarry Smith cols = scols; 7260752156aSBarry Smith ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr); 72787828ca2SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr); 728b0a32e0cSBarry Smith vals = svals; 7290752156aSBarry Smith ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr); 73088e32edaSLois Curfman McInnes 73188e32edaSLois Curfman McInnes /* insert into matrix */ 73288e32edaSLois Curfman McInnes for (i=0; i<M; i++) { 73388e32edaSLois Curfman McInnes for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j]; 73488e32edaSLois Curfman McInnes svals += rowlengths[i]; scols += rowlengths[i]; 73588e32edaSLois Curfman McInnes } 736606d414cSSatish Balay ierr = PetscFree(vals);CHKERRQ(ierr); 737606d414cSSatish Balay ierr = PetscFree(cols);CHKERRQ(ierr); 738606d414cSSatish Balay ierr = PetscFree(rowlengths);CHKERRQ(ierr); 73988e32edaSLois Curfman McInnes 7406d4a8577SBarry Smith ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 7416d4a8577SBarry Smith ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 74290ace30eSBarry Smith } 7433a40ed3dSBarry Smith PetscFunctionReturn(0); 74488e32edaSLois Curfman McInnes } 74588e32edaSLois Curfman McInnes 746e090d566SSatish Balay #include "petscsys.h" 747932b0c3eSLois Curfman McInnes 7484a2ae208SSatish Balay #undef __FUNCT__ 7494a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII" 7506849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer) 751289bc588SBarry Smith { 752932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 753dfbe8321SBarry Smith PetscErrorCode ierr; 75413f74950SBarry Smith PetscInt i,j; 7552dcb1b2aSMatthew Knepley const char *name; 75687828ca2SBarry Smith PetscScalar *v; 757f3ef73ceSBarry Smith PetscViewerFormat format; 758932b0c3eSLois Curfman McInnes 7593a40ed3dSBarry Smith PetscFunctionBegin; 760435da068SBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 761b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 762456192e2SBarry Smith if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) { 7633a40ed3dSBarry Smith PetscFunctionReturn(0); /* do nothing for now */ 764fb9695e5SSatish Balay } else if (format == PETSC_VIEWER_ASCII_COMMON) { 765b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 766273d9f13SBarry Smith for (i=0; i<A->m; i++) { 76744cd7ae7SLois Curfman McInnes v = a->v + i; 76877431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr); 769273d9f13SBarry Smith for (j=0; j<A->n; j++) { 770aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 771329f5518SBarry Smith if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) { 772a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G + %G i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 773329f5518SBarry Smith } else if (PetscRealPart(*v)) { 774a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,PetscRealPart(*v));CHKERRQ(ierr); 7756831982aSBarry Smith } 77680cd9d93SLois Curfman McInnes #else 7776831982aSBarry Smith if (*v) { 778a83599f4SBarry Smith ierr = PetscViewerASCIIPrintf(viewer," (%D, %G) ",j,*v);CHKERRQ(ierr); 7796831982aSBarry Smith } 78080cd9d93SLois Curfman McInnes #endif 7811b807ce4Svictorle v += a->lda; 78280cd9d93SLois Curfman McInnes } 783b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 78480cd9d93SLois Curfman McInnes } 785b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 7863a40ed3dSBarry Smith } else { 787b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr); 788aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 789ffac6cdbSBarry Smith PetscTruth allreal = PETSC_TRUE; 79047989497SBarry Smith /* determine if matrix has all real values */ 79147989497SBarry Smith v = a->v; 792201f5f94SSatish Balay for (i=0; i<A->m*A->n; i++) { 793ffac6cdbSBarry Smith if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;} 79447989497SBarry Smith } 79547989497SBarry Smith #endif 796fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 7973a7fca6bSBarry Smith ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr); 79877431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->m,A->n);CHKERRQ(ierr); 79977431f27SBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->m,A->n);CHKERRQ(ierr); 800fb9695e5SSatish Balay ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr); 801ffac6cdbSBarry Smith } 802ffac6cdbSBarry Smith 803273d9f13SBarry Smith for (i=0; i<A->m; i++) { 804932b0c3eSLois Curfman McInnes v = a->v + i; 805273d9f13SBarry Smith for (j=0; j<A->n; j++) { 806aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 80747989497SBarry Smith if (allreal) { 8081b807ce4Svictorle ierr = PetscViewerASCIIPrintf(viewer,"%6.4e ",PetscRealPart(*v));CHKERRQ(ierr); 80947989497SBarry Smith } else { 8101b807ce4Svictorle ierr = PetscViewerASCIIPrintf(viewer,"%6.4e + %6.4e i ",PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr); 81147989497SBarry Smith } 812289bc588SBarry Smith #else 8131b807ce4Svictorle ierr = PetscViewerASCIIPrintf(viewer,"%6.4e ",*v);CHKERRQ(ierr); 814289bc588SBarry Smith #endif 8151b807ce4Svictorle v += a->lda; 816289bc588SBarry Smith } 817b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr); 818289bc588SBarry Smith } 819fb9695e5SSatish Balay if (format == PETSC_VIEWER_ASCII_MATLAB) { 820b0a32e0cSBarry Smith ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr); 821ffac6cdbSBarry Smith } 822b0a32e0cSBarry Smith ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr); 823da3a660dSBarry Smith } 824b0a32e0cSBarry Smith ierr = PetscViewerFlush(viewer);CHKERRQ(ierr); 8253a40ed3dSBarry Smith PetscFunctionReturn(0); 826289bc588SBarry Smith } 827289bc588SBarry Smith 8284a2ae208SSatish Balay #undef __FUNCT__ 8294a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary" 8306849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer) 831932b0c3eSLois Curfman McInnes { 832932b0c3eSLois Curfman McInnes Mat_SeqDense *a = (Mat_SeqDense*)A->data; 8336849ba73SBarry Smith PetscErrorCode ierr; 83413f74950SBarry Smith int fd; 83513f74950SBarry Smith PetscInt ict,j,n = A->n,m = A->m,i,*col_lens,nz = m*n; 83687828ca2SBarry Smith PetscScalar *v,*anonz,*vals; 837f3ef73ceSBarry Smith PetscViewerFormat format; 838932b0c3eSLois Curfman McInnes 8393a40ed3dSBarry Smith PetscFunctionBegin; 840b0a32e0cSBarry Smith ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr); 84190ace30eSBarry Smith 842b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 843fb9695e5SSatish Balay if (format == PETSC_VIEWER_BINARY_NATIVE) { 84490ace30eSBarry Smith /* store the matrix as a dense matrix */ 84513f74950SBarry Smith ierr = PetscMalloc(4*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 846552e946dSBarry Smith col_lens[0] = MAT_FILE_COOKIE; 84790ace30eSBarry Smith col_lens[1] = m; 84890ace30eSBarry Smith col_lens[2] = n; 84990ace30eSBarry Smith col_lens[3] = MATRIX_BINARY_FORMAT_DENSE; 8506f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 851606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 85290ace30eSBarry Smith 85390ace30eSBarry Smith /* write out matrix, by rows */ 85487828ca2SBarry Smith ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr); 85590ace30eSBarry Smith v = a->v; 85690ace30eSBarry Smith for (i=0; i<m; i++) { 85790ace30eSBarry Smith for (j=0; j<n; j++) { 85890ace30eSBarry Smith vals[i + j*m] = *v++; 85990ace30eSBarry Smith } 86090ace30eSBarry Smith } 8616f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 862606d414cSSatish Balay ierr = PetscFree(vals);CHKERRQ(ierr); 86390ace30eSBarry Smith } else { 86413f74950SBarry Smith ierr = PetscMalloc((4+nz)*sizeof(PetscInt),&col_lens);CHKERRQ(ierr); 865552e946dSBarry Smith col_lens[0] = MAT_FILE_COOKIE; 866932b0c3eSLois Curfman McInnes col_lens[1] = m; 867932b0c3eSLois Curfman McInnes col_lens[2] = n; 868932b0c3eSLois Curfman McInnes col_lens[3] = nz; 869932b0c3eSLois Curfman McInnes 870932b0c3eSLois Curfman McInnes /* store lengths of each row and write (including header) to file */ 871932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) col_lens[4+i] = n; 8726f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr); 873932b0c3eSLois Curfman McInnes 874932b0c3eSLois Curfman McInnes /* Possibly should write in smaller increments, not whole matrix at once? */ 875932b0c3eSLois Curfman McInnes /* store column indices (zero start index) */ 876932b0c3eSLois Curfman McInnes ict = 0; 877932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 878932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) col_lens[ict++] = j; 879932b0c3eSLois Curfman McInnes } 8806f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr); 881606d414cSSatish Balay ierr = PetscFree(col_lens);CHKERRQ(ierr); 882932b0c3eSLois Curfman McInnes 883932b0c3eSLois Curfman McInnes /* store nonzero values */ 88487828ca2SBarry Smith ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr); 885932b0c3eSLois Curfman McInnes ict = 0; 886932b0c3eSLois Curfman McInnes for (i=0; i<m; i++) { 887932b0c3eSLois Curfman McInnes v = a->v + i; 888932b0c3eSLois Curfman McInnes for (j=0; j<n; j++) { 8891b807ce4Svictorle anonz[ict++] = *v; v += a->lda; 890932b0c3eSLois Curfman McInnes } 891932b0c3eSLois Curfman McInnes } 8926f69ff64SBarry Smith ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr); 893606d414cSSatish Balay ierr = PetscFree(anonz);CHKERRQ(ierr); 89490ace30eSBarry Smith } 8953a40ed3dSBarry Smith PetscFunctionReturn(0); 896932b0c3eSLois Curfman McInnes } 897932b0c3eSLois Curfman McInnes 8984a2ae208SSatish Balay #undef __FUNCT__ 8994a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom" 900dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa) 901f1af5d2fSBarry Smith { 902f1af5d2fSBarry Smith Mat A = (Mat) Aa; 903f1af5d2fSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 9046849ba73SBarry Smith PetscErrorCode ierr; 90513f74950SBarry Smith PetscInt m = A->m,n = A->n,color,i,j; 90687828ca2SBarry Smith PetscScalar *v = a->v; 907b0a32e0cSBarry Smith PetscViewer viewer; 908b0a32e0cSBarry Smith PetscDraw popup; 909329f5518SBarry Smith PetscReal xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0; 910f3ef73ceSBarry Smith PetscViewerFormat format; 911f1af5d2fSBarry Smith 912f1af5d2fSBarry Smith PetscFunctionBegin; 913f1af5d2fSBarry Smith 914f1af5d2fSBarry Smith ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr); 915b0a32e0cSBarry Smith ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr); 916b0a32e0cSBarry Smith ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr); 917f1af5d2fSBarry Smith 918f1af5d2fSBarry Smith /* Loop over matrix elements drawing boxes */ 919fb9695e5SSatish Balay if (format != PETSC_VIEWER_DRAW_CONTOUR) { 920f1af5d2fSBarry Smith /* Blue for negative and Red for positive */ 921b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 922f1af5d2fSBarry Smith for(j = 0; j < n; j++) { 923f1af5d2fSBarry Smith x_l = j; 924f1af5d2fSBarry Smith x_r = x_l + 1.0; 925f1af5d2fSBarry Smith for(i = 0; i < m; i++) { 926f1af5d2fSBarry Smith y_l = m - i - 1.0; 927f1af5d2fSBarry Smith y_r = y_l + 1.0; 928f1af5d2fSBarry Smith #if defined(PETSC_USE_COMPLEX) 929329f5518SBarry Smith if (PetscRealPart(v[j*m+i]) > 0.) { 930b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 931329f5518SBarry Smith } else if (PetscRealPart(v[j*m+i]) < 0.) { 932b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 933f1af5d2fSBarry Smith } else { 934f1af5d2fSBarry Smith continue; 935f1af5d2fSBarry Smith } 936f1af5d2fSBarry Smith #else 937f1af5d2fSBarry Smith if (v[j*m+i] > 0.) { 938b0a32e0cSBarry Smith color = PETSC_DRAW_RED; 939f1af5d2fSBarry Smith } else if (v[j*m+i] < 0.) { 940b0a32e0cSBarry Smith color = PETSC_DRAW_BLUE; 941f1af5d2fSBarry Smith } else { 942f1af5d2fSBarry Smith continue; 943f1af5d2fSBarry Smith } 944f1af5d2fSBarry Smith #endif 945b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 946f1af5d2fSBarry Smith } 947f1af5d2fSBarry Smith } 948f1af5d2fSBarry Smith } else { 949f1af5d2fSBarry Smith /* use contour shading to indicate magnitude of values */ 950f1af5d2fSBarry Smith /* first determine max of all nonzero values */ 951f1af5d2fSBarry Smith for(i = 0; i < m*n; i++) { 952f1af5d2fSBarry Smith if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]); 953f1af5d2fSBarry Smith } 954b0a32e0cSBarry Smith scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv; 955b0a32e0cSBarry Smith ierr = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr); 956b0a32e0cSBarry Smith if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);} 957f1af5d2fSBarry Smith for(j = 0; j < n; j++) { 958f1af5d2fSBarry Smith x_l = j; 959f1af5d2fSBarry Smith x_r = x_l + 1.0; 960f1af5d2fSBarry Smith for(i = 0; i < m; i++) { 961f1af5d2fSBarry Smith y_l = m - i - 1.0; 962f1af5d2fSBarry Smith y_r = y_l + 1.0; 963b0a32e0cSBarry Smith color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i])); 964b0a32e0cSBarry Smith ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr); 965f1af5d2fSBarry Smith } 966f1af5d2fSBarry Smith } 967f1af5d2fSBarry Smith } 968f1af5d2fSBarry Smith PetscFunctionReturn(0); 969f1af5d2fSBarry Smith } 970f1af5d2fSBarry Smith 9714a2ae208SSatish Balay #undef __FUNCT__ 9724a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw" 973dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer) 974f1af5d2fSBarry Smith { 975b0a32e0cSBarry Smith PetscDraw draw; 976f1af5d2fSBarry Smith PetscTruth isnull; 977329f5518SBarry Smith PetscReal xr,yr,xl,yl,h,w; 978dfbe8321SBarry Smith PetscErrorCode ierr; 979f1af5d2fSBarry Smith 980f1af5d2fSBarry Smith PetscFunctionBegin; 981b0a32e0cSBarry Smith ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr); 982b0a32e0cSBarry Smith ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr); 983abc0a331SBarry Smith if (isnull) PetscFunctionReturn(0); 984f1af5d2fSBarry Smith 985f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr); 986273d9f13SBarry Smith xr = A->n; yr = A->m; h = yr/10.0; w = xr/10.0; 987f1af5d2fSBarry Smith xr += w; yr += h; xl = -w; yl = -h; 988b0a32e0cSBarry Smith ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr); 989b0a32e0cSBarry Smith ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr); 990f1af5d2fSBarry Smith ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr); 991f1af5d2fSBarry Smith PetscFunctionReturn(0); 992f1af5d2fSBarry Smith } 993f1af5d2fSBarry Smith 9944a2ae208SSatish Balay #undef __FUNCT__ 9954a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense" 996dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer) 997932b0c3eSLois Curfman McInnes { 998dfbe8321SBarry Smith PetscErrorCode ierr; 99932077d6dSBarry Smith PetscTruth issocket,iascii,isbinary,isdraw; 1000932b0c3eSLois Curfman McInnes 10013a40ed3dSBarry Smith PetscFunctionBegin; 1002b0a32e0cSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_SOCKET,&issocket);CHKERRQ(ierr); 100332077d6dSBarry Smith ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&iascii);CHKERRQ(ierr); 1004fb9695e5SSatish Balay ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr); 1005fb9695e5SSatish Balay ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_DRAW,&isdraw);CHKERRQ(ierr); 10060f5bd95cSBarry Smith 1007c45a1595SBarry Smith if (iascii) { 1008c45a1595SBarry Smith ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr); 10094cf18111SSatish Balay #if defined(PETSC_USE_SOCKET_VIEWER) 1010c45a1595SBarry Smith } else if (issocket) { 10114cf18111SSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1012634064b4SBarry Smith if (a->lda>A->m) SETERRQ(PETSC_ERR_SUP,"Case can not handle LDA"); 1013b0a32e0cSBarry Smith ierr = PetscViewerSocketPutScalar(viewer,A->m,A->n,a->v);CHKERRQ(ierr); 1014c45a1595SBarry Smith #endif 10150f5bd95cSBarry Smith } else if (isbinary) { 10163a40ed3dSBarry Smith ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr); 1017f1af5d2fSBarry Smith } else if (isdraw) { 1018f1af5d2fSBarry Smith ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr); 10195cd90555SBarry Smith } else { 1020958c9bccSBarry Smith SETERRQ1(PETSC_ERR_SUP,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name); 1021932b0c3eSLois Curfman McInnes } 10223a40ed3dSBarry Smith PetscFunctionReturn(0); 1023932b0c3eSLois Curfman McInnes } 1024289bc588SBarry Smith 10254a2ae208SSatish Balay #undef __FUNCT__ 10264a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense" 1027dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat) 1028289bc588SBarry Smith { 1029ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)mat->data; 1030dfbe8321SBarry Smith PetscErrorCode ierr; 103190f02eecSBarry Smith 10323a40ed3dSBarry Smith PetscFunctionBegin; 1033aa482453SBarry Smith #if defined(PETSC_USE_LOG) 103477431f27SBarry Smith PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->m,mat->n); 1035a5a9c739SBarry Smith #endif 1036606d414cSSatish Balay if (l->pivots) {ierr = PetscFree(l->pivots);CHKERRQ(ierr);} 1037606d414cSSatish Balay if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);} 1038606d414cSSatish Balay ierr = PetscFree(l);CHKERRQ(ierr); 1039901853e0SKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)mat,"MatSeqDenseSetPreallocation_C","",PETSC_NULL);CHKERRQ(ierr); 10403a40ed3dSBarry Smith PetscFunctionReturn(0); 1041289bc588SBarry Smith } 1042289bc588SBarry Smith 10434a2ae208SSatish Balay #undef __FUNCT__ 10444a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense" 1045dfbe8321SBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,Mat *matout) 1046289bc588SBarry Smith { 1047c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 10486849ba73SBarry Smith PetscErrorCode ierr; 104913f74950SBarry Smith PetscInt k,j,m,n,M; 105087828ca2SBarry Smith PetscScalar *v,tmp; 105148b35521SBarry Smith 10523a40ed3dSBarry Smith PetscFunctionBegin; 10531b807ce4Svictorle v = mat->v; m = A->m; M = mat->lda; n = A->n; 10547c922b88SBarry Smith if (!matout) { /* in place transpose */ 1055a5ce6ee0Svictorle if (m != n) { 1056634064b4SBarry Smith SETERRQ(PETSC_ERR_SUP,"Can not transpose non-square matrix in place"); 1057d64ed03dSBarry Smith } else { 1058d3e5ee88SLois Curfman McInnes for (j=0; j<m; j++) { 1059289bc588SBarry Smith for (k=0; k<j; k++) { 10601b807ce4Svictorle tmp = v[j + k*M]; 10611b807ce4Svictorle v[j + k*M] = v[k + j*M]; 10621b807ce4Svictorle v[k + j*M] = tmp; 1063289bc588SBarry Smith } 1064289bc588SBarry Smith } 1065d64ed03dSBarry Smith } 10663a40ed3dSBarry Smith } else { /* out-of-place transpose */ 1067d3e5ee88SLois Curfman McInnes Mat tmat; 1068ec8511deSBarry Smith Mat_SeqDense *tmatd; 106987828ca2SBarry Smith PetscScalar *v2; 1070ea709b57SSatish Balay 1071f69a0ea3SMatthew Knepley ierr = MatCreate(A->comm,&tmat);CHKERRQ(ierr); 1072f69a0ea3SMatthew Knepley ierr = MatSetSizes(tmat,A->n,A->m,A->n,A->m);CHKERRQ(ierr); 10735c5985e7SKris Buschelman ierr = MatSetType(tmat,A->type_name);CHKERRQ(ierr); 10745c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(tmat,PETSC_NULL);CHKERRQ(ierr); 1075ec8511deSBarry Smith tmatd = (Mat_SeqDense*)tmat->data; 10760de55854SLois Curfman McInnes v = mat->v; v2 = tmatd->v; 1077d3e5ee88SLois Curfman McInnes for (j=0; j<n; j++) { 10781b807ce4Svictorle for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M]; 1079d3e5ee88SLois Curfman McInnes } 10806d4a8577SBarry Smith ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 10816d4a8577SBarry Smith ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 1082d3e5ee88SLois Curfman McInnes *matout = tmat; 108348b35521SBarry Smith } 10843a40ed3dSBarry Smith PetscFunctionReturn(0); 1085289bc588SBarry Smith } 1086289bc588SBarry Smith 10874a2ae208SSatish Balay #undef __FUNCT__ 10884a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense" 1089dfbe8321SBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscTruth *flg) 1090289bc588SBarry Smith { 1091c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data; 1092c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data; 109313f74950SBarry Smith PetscInt i,j; 109487828ca2SBarry Smith PetscScalar *v1 = mat1->v,*v2 = mat2->v; 10959ea5d5aeSSatish Balay 10963a40ed3dSBarry Smith PetscFunctionBegin; 1097273d9f13SBarry Smith if (A1->m != A2->m) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 1098273d9f13SBarry Smith if (A1->n != A2->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 10991b807ce4Svictorle for (i=0; i<A1->m; i++) { 11001b807ce4Svictorle v1 = mat1->v+i; v2 = mat2->v+i; 11011b807ce4Svictorle for (j=0; j<A1->n; j++) { 11023a40ed3dSBarry Smith if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);} 11031b807ce4Svictorle v1 += mat1->lda; v2 += mat2->lda; 11041b807ce4Svictorle } 1105289bc588SBarry Smith } 110677c4ece6SBarry Smith *flg = PETSC_TRUE; 11073a40ed3dSBarry Smith PetscFunctionReturn(0); 1108289bc588SBarry Smith } 1109289bc588SBarry Smith 11104a2ae208SSatish Balay #undef __FUNCT__ 11114a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense" 1112dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v) 1113289bc588SBarry Smith { 1114c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 1115dfbe8321SBarry Smith PetscErrorCode ierr; 111613f74950SBarry Smith PetscInt i,n,len; 111787828ca2SBarry Smith PetscScalar *x,zero = 0.0; 111844cd7ae7SLois Curfman McInnes 11193a40ed3dSBarry Smith PetscFunctionBegin; 11202dcb1b2aSMatthew Knepley ierr = VecSet(v,zero);CHKERRQ(ierr); 11217a97a34bSBarry Smith ierr = VecGetSize(v,&n);CHKERRQ(ierr); 11221ebc52fbSHong Zhang ierr = VecGetArray(v,&x);CHKERRQ(ierr); 1123273d9f13SBarry Smith len = PetscMin(A->m,A->n); 1124273d9f13SBarry Smith if (n != A->m) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec"); 112544cd7ae7SLois Curfman McInnes for (i=0; i<len; i++) { 11261b807ce4Svictorle x[i] = mat->v[i*mat->lda + i]; 1127289bc588SBarry Smith } 11281ebc52fbSHong Zhang ierr = VecRestoreArray(v,&x);CHKERRQ(ierr); 11293a40ed3dSBarry Smith PetscFunctionReturn(0); 1130289bc588SBarry Smith } 1131289bc588SBarry Smith 11324a2ae208SSatish Balay #undef __FUNCT__ 11334a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense" 1134dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr) 1135289bc588SBarry Smith { 1136c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 113787828ca2SBarry Smith PetscScalar *l,*r,x,*v; 1138dfbe8321SBarry Smith PetscErrorCode ierr; 113913f74950SBarry Smith PetscInt i,j,m = A->m,n = A->n; 114055659b69SBarry Smith 11413a40ed3dSBarry Smith PetscFunctionBegin; 114228988994SBarry Smith if (ll) { 11437a97a34bSBarry Smith ierr = VecGetSize(ll,&m);CHKERRQ(ierr); 11441ebc52fbSHong Zhang ierr = VecGetArray(ll,&l);CHKERRQ(ierr); 1145273d9f13SBarry Smith if (m != A->m) SETERRQ(PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size"); 1146da3a660dSBarry Smith for (i=0; i<m; i++) { 1147da3a660dSBarry Smith x = l[i]; 1148da3a660dSBarry Smith v = mat->v + i; 1149da3a660dSBarry Smith for (j=0; j<n; j++) { (*v) *= x; v+= m;} 1150da3a660dSBarry Smith } 11511ebc52fbSHong Zhang ierr = VecRestoreArray(ll,&l);CHKERRQ(ierr); 1152efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1153da3a660dSBarry Smith } 115428988994SBarry Smith if (rr) { 11557a97a34bSBarry Smith ierr = VecGetSize(rr,&n);CHKERRQ(ierr); 11561ebc52fbSHong Zhang ierr = VecGetArray(rr,&r);CHKERRQ(ierr); 1157273d9f13SBarry Smith if (n != A->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size"); 1158da3a660dSBarry Smith for (i=0; i<n; i++) { 1159da3a660dSBarry Smith x = r[i]; 1160da3a660dSBarry Smith v = mat->v + i*m; 1161da3a660dSBarry Smith for (j=0; j<m; j++) { (*v++) *= x;} 1162da3a660dSBarry Smith } 11631ebc52fbSHong Zhang ierr = VecRestoreArray(rr,&r);CHKERRQ(ierr); 1164efee365bSSatish Balay ierr = PetscLogFlops(n*m);CHKERRQ(ierr); 1165da3a660dSBarry Smith } 11663a40ed3dSBarry Smith PetscFunctionReturn(0); 1167289bc588SBarry Smith } 1168289bc588SBarry Smith 11694a2ae208SSatish Balay #undef __FUNCT__ 11704a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense" 1171dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm) 1172289bc588SBarry Smith { 1173c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 117487828ca2SBarry Smith PetscScalar *v = mat->v; 1175329f5518SBarry Smith PetscReal sum = 0.0; 117613f74950SBarry Smith PetscInt lda=mat->lda,m=A->m,i,j; 1177efee365bSSatish Balay PetscErrorCode ierr; 117855659b69SBarry Smith 11793a40ed3dSBarry Smith PetscFunctionBegin; 1180289bc588SBarry Smith if (type == NORM_FROBENIUS) { 1181a5ce6ee0Svictorle if (lda>m) { 1182a5ce6ee0Svictorle for (j=0; j<A->n; j++) { 1183a5ce6ee0Svictorle v = mat->v+j*lda; 1184a5ce6ee0Svictorle for (i=0; i<m; i++) { 1185a5ce6ee0Svictorle #if defined(PETSC_USE_COMPLEX) 1186a5ce6ee0Svictorle sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1187a5ce6ee0Svictorle #else 1188a5ce6ee0Svictorle sum += (*v)*(*v); v++; 1189a5ce6ee0Svictorle #endif 1190a5ce6ee0Svictorle } 1191a5ce6ee0Svictorle } 1192a5ce6ee0Svictorle } else { 1193273d9f13SBarry Smith for (i=0; i<A->n*A->m; i++) { 1194aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX) 1195329f5518SBarry Smith sum += PetscRealPart(PetscConj(*v)*(*v)); v++; 1196289bc588SBarry Smith #else 1197289bc588SBarry Smith sum += (*v)*(*v); v++; 1198289bc588SBarry Smith #endif 1199289bc588SBarry Smith } 1200a5ce6ee0Svictorle } 1201064f8208SBarry Smith *nrm = sqrt(sum); 1202efee365bSSatish Balay ierr = PetscLogFlops(2*A->n*A->m);CHKERRQ(ierr); 12033a40ed3dSBarry Smith } else if (type == NORM_1) { 1204064f8208SBarry Smith *nrm = 0.0; 1205273d9f13SBarry Smith for (j=0; j<A->n; j++) { 12061b807ce4Svictorle v = mat->v + j*mat->lda; 1207289bc588SBarry Smith sum = 0.0; 1208273d9f13SBarry Smith for (i=0; i<A->m; i++) { 120933a8263dSBarry Smith sum += PetscAbsScalar(*v); v++; 1210289bc588SBarry Smith } 1211064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1212289bc588SBarry Smith } 1213efee365bSSatish Balay ierr = PetscLogFlops(A->n*A->m);CHKERRQ(ierr); 12143a40ed3dSBarry Smith } else if (type == NORM_INFINITY) { 1215064f8208SBarry Smith *nrm = 0.0; 1216273d9f13SBarry Smith for (j=0; j<A->m; j++) { 1217289bc588SBarry Smith v = mat->v + j; 1218289bc588SBarry Smith sum = 0.0; 1219273d9f13SBarry Smith for (i=0; i<A->n; i++) { 12201b807ce4Svictorle sum += PetscAbsScalar(*v); v += mat->lda; 1221289bc588SBarry Smith } 1222064f8208SBarry Smith if (sum > *nrm) *nrm = sum; 1223289bc588SBarry Smith } 1224efee365bSSatish Balay ierr = PetscLogFlops(A->n*A->m);CHKERRQ(ierr); 12253a40ed3dSBarry Smith } else { 122629bbc08cSBarry Smith SETERRQ(PETSC_ERR_SUP,"No two norm"); 1227289bc588SBarry Smith } 12283a40ed3dSBarry Smith PetscFunctionReturn(0); 1229289bc588SBarry Smith } 1230289bc588SBarry Smith 12314a2ae208SSatish Balay #undef __FUNCT__ 12324a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense" 1233dfbe8321SBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op) 1234289bc588SBarry Smith { 1235c0bbcb79SLois Curfman McInnes Mat_SeqDense *aij = (Mat_SeqDense*)A->data; 123663ba0a88SBarry Smith PetscErrorCode ierr; 123767e560aaSBarry Smith 12383a40ed3dSBarry Smith PetscFunctionBegin; 1239b5a2b587SKris Buschelman switch (op) { 1240b5a2b587SKris Buschelman case MAT_ROW_ORIENTED: 1241b5a2b587SKris Buschelman aij->roworiented = PETSC_TRUE; 1242b5a2b587SKris Buschelman break; 1243b5a2b587SKris Buschelman case MAT_COLUMN_ORIENTED: 1244b5a2b587SKris Buschelman aij->roworiented = PETSC_FALSE; 1245b5a2b587SKris Buschelman break; 1246b5a2b587SKris Buschelman case MAT_ROWS_SORTED: 1247b5a2b587SKris Buschelman case MAT_ROWS_UNSORTED: 1248b5a2b587SKris Buschelman case MAT_COLUMNS_SORTED: 1249b5a2b587SKris Buschelman case MAT_COLUMNS_UNSORTED: 1250b5a2b587SKris Buschelman case MAT_NO_NEW_NONZERO_LOCATIONS: 1251b5a2b587SKris Buschelman case MAT_YES_NEW_NONZERO_LOCATIONS: 1252b5a2b587SKris Buschelman case MAT_NEW_NONZERO_LOCATION_ERR: 1253b5a2b587SKris Buschelman case MAT_NO_NEW_DIAGONALS: 1254b5a2b587SKris Buschelman case MAT_YES_NEW_DIAGONALS: 1255b5a2b587SKris Buschelman case MAT_IGNORE_OFF_PROC_ENTRIES: 1256b5a2b587SKris Buschelman case MAT_USE_HASH_TABLE: 1257*ae15b995SBarry Smith ierr = PetscInfo(A,"Option ignored\n");CHKERRQ(ierr); 1258b5a2b587SKris Buschelman break; 125977e54ba9SKris Buschelman case MAT_SYMMETRIC: 126077e54ba9SKris Buschelman case MAT_STRUCTURALLY_SYMMETRIC: 12619a4540c5SBarry Smith case MAT_NOT_SYMMETRIC: 12629a4540c5SBarry Smith case MAT_NOT_STRUCTURALLY_SYMMETRIC: 12639a4540c5SBarry Smith case MAT_HERMITIAN: 12649a4540c5SBarry Smith case MAT_NOT_HERMITIAN: 12659a4540c5SBarry Smith case MAT_SYMMETRY_ETERNAL: 12669a4540c5SBarry Smith case MAT_NOT_SYMMETRY_ETERNAL: 126777e54ba9SKris Buschelman break; 1268b5a2b587SKris Buschelman default: 126929bbc08cSBarry Smith SETERRQ(PETSC_ERR_SUP,"unknown option"); 12703a40ed3dSBarry Smith } 12713a40ed3dSBarry Smith PetscFunctionReturn(0); 1272289bc588SBarry Smith } 1273289bc588SBarry Smith 12744a2ae208SSatish Balay #undef __FUNCT__ 12754a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense" 1276dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A) 12776f0a148fSBarry Smith { 1278ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 12796849ba73SBarry Smith PetscErrorCode ierr; 128013f74950SBarry Smith PetscInt lda=l->lda,m=A->m,j; 12813a40ed3dSBarry Smith 12823a40ed3dSBarry Smith PetscFunctionBegin; 1283a5ce6ee0Svictorle if (lda>m) { 1284a5ce6ee0Svictorle for (j=0; j<A->n; j++) { 1285a5ce6ee0Svictorle ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr); 1286a5ce6ee0Svictorle } 1287a5ce6ee0Svictorle } else { 128887828ca2SBarry Smith ierr = PetscMemzero(l->v,A->m*A->n*sizeof(PetscScalar));CHKERRQ(ierr); 1289a5ce6ee0Svictorle } 12903a40ed3dSBarry Smith PetscFunctionReturn(0); 12916f0a148fSBarry Smith } 12926f0a148fSBarry Smith 12934a2ae208SSatish Balay #undef __FUNCT__ 12944a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense" 1295f4df32b1SMatthew Knepley PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag) 12966f0a148fSBarry Smith { 1297ec8511deSBarry Smith Mat_SeqDense *l = (Mat_SeqDense*)A->data; 1298f4df32b1SMatthew Knepley PetscInt n = A->n,i,j; 129987828ca2SBarry Smith PetscScalar *slot; 130055659b69SBarry Smith 13013a40ed3dSBarry Smith PetscFunctionBegin; 13026f0a148fSBarry Smith for (i=0; i<N; i++) { 13036f0a148fSBarry Smith slot = l->v + rows[i]; 13046f0a148fSBarry Smith for (j=0; j<n; j++) { *slot = 0.0; slot += n;} 13056f0a148fSBarry Smith } 1306f4df32b1SMatthew Knepley if (diag != 0.0) { 13076f0a148fSBarry Smith for (i=0; i<N; i++) { 13086f0a148fSBarry Smith slot = l->v + (n+1)*rows[i]; 1309f4df32b1SMatthew Knepley *slot = diag; 13106f0a148fSBarry Smith } 13116f0a148fSBarry Smith } 13123a40ed3dSBarry Smith PetscFunctionReturn(0); 13136f0a148fSBarry Smith } 1314557bce09SLois Curfman McInnes 13154a2ae208SSatish Balay #undef __FUNCT__ 13164a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqDense" 1317dfbe8321SBarry Smith PetscErrorCode MatGetArray_SeqDense(Mat A,PetscScalar *array[]) 131864e87e97SBarry Smith { 1319c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 13203a40ed3dSBarry Smith 13213a40ed3dSBarry Smith PetscFunctionBegin; 1322a9fe9ddaSSatish Balay if (mat->lda != A->m) SETERRQ(PETSC_ERR_SUP,"Cannot get array for Dense matrices with LDA different from number of rows"); 132364e87e97SBarry Smith *array = mat->v; 13243a40ed3dSBarry Smith PetscFunctionReturn(0); 132564e87e97SBarry Smith } 13260754003eSLois Curfman McInnes 13274a2ae208SSatish Balay #undef __FUNCT__ 13284a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense" 1329dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqDense(Mat A,PetscScalar *array[]) 1330ff14e315SSatish Balay { 13313a40ed3dSBarry Smith PetscFunctionBegin; 133209b544d4SBarry Smith *array = 0; /* user cannot accidently use the array later */ 13333a40ed3dSBarry Smith PetscFunctionReturn(0); 1334ff14e315SSatish Balay } 13350754003eSLois Curfman McInnes 13364a2ae208SSatish Balay #undef __FUNCT__ 13374a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense" 133813f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B) 13390754003eSLois Curfman McInnes { 1340c0bbcb79SLois Curfman McInnes Mat_SeqDense *mat = (Mat_SeqDense*)A->data; 13416849ba73SBarry Smith PetscErrorCode ierr; 134221a2c019SBarry Smith PetscInt i,j,*irow,*icol,nrows,ncols; 134387828ca2SBarry Smith PetscScalar *av,*bv,*v = mat->v; 13440754003eSLois Curfman McInnes Mat newmat; 13450754003eSLois Curfman McInnes 13463a40ed3dSBarry Smith PetscFunctionBegin; 134778b31e54SBarry Smith ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr); 134878b31e54SBarry Smith ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr); 1349e03a110bSBarry Smith ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr); 1350e03a110bSBarry Smith ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr); 13510754003eSLois Curfman McInnes 1352182d2002SSatish Balay /* Check submatrixcall */ 1353182d2002SSatish Balay if (scall == MAT_REUSE_MATRIX) { 135413f74950SBarry Smith PetscInt n_cols,n_rows; 1355182d2002SSatish Balay ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr); 135621a2c019SBarry Smith if (n_rows != nrows || n_cols != ncols) { 135721a2c019SBarry Smith /* resize the result result matrix to match number of requested rows/columns */ 135821a2c019SBarry Smith ierr = MatSetSizes(*B,nrows,nrows,nrows,nrows);CHKERRQ(ierr); 135921a2c019SBarry Smith } 1360182d2002SSatish Balay newmat = *B; 1361182d2002SSatish Balay } else { 13620754003eSLois Curfman McInnes /* Create and fill new matrix */ 1363f69a0ea3SMatthew Knepley ierr = MatCreate(A->comm,&newmat);CHKERRQ(ierr); 1364f69a0ea3SMatthew Knepley ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr); 13655c5985e7SKris Buschelman ierr = MatSetType(newmat,A->type_name);CHKERRQ(ierr); 13665c5985e7SKris Buschelman ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr); 1367182d2002SSatish Balay } 1368182d2002SSatish Balay 1369182d2002SSatish Balay /* Now extract the data pointers and do the copy,column at a time */ 1370182d2002SSatish Balay bv = ((Mat_SeqDense*)newmat->data)->v; 1371182d2002SSatish Balay 1372182d2002SSatish Balay for (i=0; i<ncols; i++) { 13736de62eeeSBarry Smith av = v + mat->lda*icol[i]; 1374182d2002SSatish Balay for (j=0; j<nrows; j++) { 1375182d2002SSatish Balay *bv++ = av[irow[j]]; 13760754003eSLois Curfman McInnes } 13770754003eSLois Curfman McInnes } 1378182d2002SSatish Balay 1379182d2002SSatish Balay /* Assemble the matrices so that the correct flags are set */ 13806d4a8577SBarry Smith ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 13816d4a8577SBarry Smith ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr); 13820754003eSLois Curfman McInnes 13830754003eSLois Curfman McInnes /* Free work space */ 138478b31e54SBarry Smith ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr); 138578b31e54SBarry Smith ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr); 1386182d2002SSatish Balay *B = newmat; 13873a40ed3dSBarry Smith PetscFunctionReturn(0); 13880754003eSLois Curfman McInnes } 13890754003eSLois Curfman McInnes 13904a2ae208SSatish Balay #undef __FUNCT__ 13914a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense" 139213f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[]) 1393905e6a2fSBarry Smith { 13946849ba73SBarry Smith PetscErrorCode ierr; 139513f74950SBarry Smith PetscInt i; 1396905e6a2fSBarry Smith 13973a40ed3dSBarry Smith PetscFunctionBegin; 1398905e6a2fSBarry Smith if (scall == MAT_INITIAL_MATRIX) { 1399b0a32e0cSBarry Smith ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr); 1400905e6a2fSBarry Smith } 1401905e6a2fSBarry Smith 1402905e6a2fSBarry Smith for (i=0; i<n; i++) { 14036a6a5d1dSBarry Smith ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr); 1404905e6a2fSBarry Smith } 14053a40ed3dSBarry Smith PetscFunctionReturn(0); 1406905e6a2fSBarry Smith } 1407905e6a2fSBarry Smith 14084a2ae208SSatish Balay #undef __FUNCT__ 1409c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense" 1410c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode) 1411c0aa2d19SHong Zhang { 1412c0aa2d19SHong Zhang PetscFunctionBegin; 1413c0aa2d19SHong Zhang PetscFunctionReturn(0); 1414c0aa2d19SHong Zhang } 1415c0aa2d19SHong Zhang 1416c0aa2d19SHong Zhang #undef __FUNCT__ 1417c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense" 1418c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode) 1419c0aa2d19SHong Zhang { 1420c0aa2d19SHong Zhang PetscFunctionBegin; 1421c0aa2d19SHong Zhang PetscFunctionReturn(0); 1422c0aa2d19SHong Zhang } 1423c0aa2d19SHong Zhang 1424c0aa2d19SHong Zhang #undef __FUNCT__ 14254a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense" 1426dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str) 14274b0e389bSBarry Smith { 14284b0e389bSBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data; 14296849ba73SBarry Smith PetscErrorCode ierr; 143013f74950SBarry Smith PetscInt lda1=a->lda,lda2=b->lda, m=A->m,n=A->n, j; 14313a40ed3dSBarry Smith 14323a40ed3dSBarry Smith PetscFunctionBegin; 143333f4a19fSKris Buschelman /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */ 143433f4a19fSKris Buschelman if (A->ops->copy != B->ops->copy) { 1435cb5b572fSBarry Smith ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr); 14363a40ed3dSBarry Smith PetscFunctionReturn(0); 14373a40ed3dSBarry Smith } 14380dbb7854Svictorle if (m != B->m || n != B->n) SETERRQ(PETSC_ERR_ARG_SIZ,"size(B) != size(A)"); 1439a5ce6ee0Svictorle if (lda1>m || lda2>m) { 14400dbb7854Svictorle for (j=0; j<n; j++) { 1441a5ce6ee0Svictorle ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr); 1442a5ce6ee0Svictorle } 1443a5ce6ee0Svictorle } else { 144487828ca2SBarry Smith ierr = PetscMemcpy(b->v,a->v,A->m*A->n*sizeof(PetscScalar));CHKERRQ(ierr); 1445a5ce6ee0Svictorle } 1446273d9f13SBarry Smith PetscFunctionReturn(0); 1447273d9f13SBarry Smith } 1448273d9f13SBarry Smith 14494a2ae208SSatish Balay #undef __FUNCT__ 14504a2ae208SSatish Balay #define __FUNCT__ "MatSetUpPreallocation_SeqDense" 1451dfbe8321SBarry Smith PetscErrorCode MatSetUpPreallocation_SeqDense(Mat A) 1452273d9f13SBarry Smith { 1453dfbe8321SBarry Smith PetscErrorCode ierr; 1454273d9f13SBarry Smith 1455273d9f13SBarry Smith PetscFunctionBegin; 1456273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr); 14573a40ed3dSBarry Smith PetscFunctionReturn(0); 14584b0e389bSBarry Smith } 14594b0e389bSBarry Smith 1460284134d9SBarry Smith #undef __FUNCT__ 1461284134d9SBarry Smith #define __FUNCT__ "MatSetSizes_SeqDense" 1462284134d9SBarry Smith PetscErrorCode MatSetSizes_SeqDense(Mat A,PetscInt m,PetscInt n,PetscInt M,PetscInt N) 1463284134d9SBarry Smith { 1464284134d9SBarry Smith Mat_SeqDense *a = (Mat_SeqDense*)A->data; 146521a2c019SBarry Smith PetscErrorCode ierr; 1466284134d9SBarry Smith PetscFunctionBegin; 146721a2c019SBarry Smith /* this will not be called before lda, Mmax, and Nmax have been set */ 1468284134d9SBarry Smith m = PetscMax(m,M); 1469284134d9SBarry Smith n = PetscMax(n,N); 147021a2c019SBarry 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); 1471284134d9SBarry 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); 1472284134d9SBarry Smith A->m = A->M = m; 1473284134d9SBarry Smith A->n = A->N = n; 147421a2c019SBarry Smith if (a->changelda) a->lda = m; 147521a2c019SBarry Smith ierr = PetscMemzero(a->v,m*n*sizeof(PetscScalar));CHKERRQ(ierr); 1476284134d9SBarry Smith PetscFunctionReturn(0); 1477284134d9SBarry Smith } 1478284134d9SBarry Smith 1479a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/ 1480a9fe9ddaSSatish Balay #undef __FUNCT__ 1481a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense" 1482a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1483a9fe9ddaSSatish Balay { 1484a9fe9ddaSSatish Balay PetscErrorCode ierr; 1485a9fe9ddaSSatish Balay 1486a9fe9ddaSSatish Balay PetscFunctionBegin; 1487a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX){ 1488a9fe9ddaSSatish Balay ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1489a9fe9ddaSSatish Balay } 1490a9fe9ddaSSatish Balay ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1491a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1492a9fe9ddaSSatish Balay } 1493a9fe9ddaSSatish Balay 1494a9fe9ddaSSatish Balay #undef __FUNCT__ 1495a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense" 1496a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1497a9fe9ddaSSatish Balay { 1498ee16a9a1SHong Zhang PetscErrorCode ierr; 1499ee16a9a1SHong Zhang PetscInt m=A->m,n=B->n; 1500ee16a9a1SHong Zhang Mat Cmat; 1501a9fe9ddaSSatish Balay 1502ee16a9a1SHong Zhang PetscFunctionBegin; 1503ee16a9a1SHong Zhang if (A->n != B->m) SETERRQ2(PETSC_ERR_ARG_SIZ,"A->n %d != B->m %d\n",A->n,B->m); 1504ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1505ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1506ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1507ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1508ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 1509ee16a9a1SHong Zhang *C = Cmat; 1510ee16a9a1SHong Zhang PetscFunctionReturn(0); 1511ee16a9a1SHong Zhang } 1512a9fe9ddaSSatish Balay 1513a9fe9ddaSSatish Balay #undef __FUNCT__ 1514a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense" 1515a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1516a9fe9ddaSSatish Balay { 1517a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1518a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1519a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 1520a9fe9ddaSSatish Balay PetscBLASInt m=(PetscBLASInt)A->m,n=(PetscBLASInt)B->n,k=(PetscBLASInt)A->n; 1521a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1522a9fe9ddaSSatish Balay 1523a9fe9ddaSSatish Balay PetscFunctionBegin; 1524a9fe9ddaSSatish Balay BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1525a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1526a9fe9ddaSSatish Balay } 1527a9fe9ddaSSatish Balay 1528a9fe9ddaSSatish Balay #undef __FUNCT__ 1529a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTranspose_SeqDense_SeqDense" 1530a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTranspose_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C) 1531a9fe9ddaSSatish Balay { 1532a9fe9ddaSSatish Balay PetscErrorCode ierr; 1533a9fe9ddaSSatish Balay 1534a9fe9ddaSSatish Balay PetscFunctionBegin; 1535a9fe9ddaSSatish Balay if (scall == MAT_INITIAL_MATRIX){ 1536a9fe9ddaSSatish Balay ierr = MatMatMultTransposeSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr); 1537a9fe9ddaSSatish Balay } 1538a9fe9ddaSSatish Balay ierr = MatMatMultTransposeNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr); 1539a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1540a9fe9ddaSSatish Balay } 1541a9fe9ddaSSatish Balay 1542a9fe9ddaSSatish Balay #undef __FUNCT__ 1543a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeSymbolic_SeqDense_SeqDense" 1544a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C) 1545a9fe9ddaSSatish Balay { 1546ee16a9a1SHong Zhang PetscErrorCode ierr; 1547ee16a9a1SHong Zhang PetscInt m=A->n,n=B->n; 1548ee16a9a1SHong Zhang Mat Cmat; 1549a9fe9ddaSSatish Balay 1550ee16a9a1SHong Zhang PetscFunctionBegin; 1551ee16a9a1SHong Zhang if (A->m != B->m) SETERRQ2(PETSC_ERR_ARG_SIZ,"A->m %d != B->m %d\n",A->m,B->m); 1552ee16a9a1SHong Zhang ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr); 1553ee16a9a1SHong Zhang ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr); 1554ee16a9a1SHong Zhang ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr); 1555ee16a9a1SHong Zhang ierr = MatSeqDenseSetPreallocation(Cmat,PETSC_NULL);CHKERRQ(ierr); 1556ee16a9a1SHong Zhang Cmat->assembled = PETSC_TRUE; 1557ee16a9a1SHong Zhang *C = Cmat; 1558ee16a9a1SHong Zhang PetscFunctionReturn(0); 1559ee16a9a1SHong Zhang } 1560a9fe9ddaSSatish Balay 1561a9fe9ddaSSatish Balay #undef __FUNCT__ 1562a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultTransposeNumeric_SeqDense_SeqDense" 1563a9fe9ddaSSatish Balay PetscErrorCode MatMatMultTransposeNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C) 1564a9fe9ddaSSatish Balay { 1565a9fe9ddaSSatish Balay Mat_SeqDense *a = (Mat_SeqDense*)A->data; 1566a9fe9ddaSSatish Balay Mat_SeqDense *b = (Mat_SeqDense*)B->data; 1567a9fe9ddaSSatish Balay Mat_SeqDense *c = (Mat_SeqDense*)C->data; 1568a9fe9ddaSSatish Balay PetscBLASInt m=(PetscBLASInt)A->n,n=(PetscBLASInt)B->n,k=(PetscBLASInt)A->m; 1569a9fe9ddaSSatish Balay PetscScalar _DOne=1.0,_DZero=0.0; 1570a9fe9ddaSSatish Balay 1571a9fe9ddaSSatish Balay PetscFunctionBegin; 1572a9fe9ddaSSatish Balay BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda); 1573a9fe9ddaSSatish Balay PetscFunctionReturn(0); 1574a9fe9ddaSSatish Balay } 1575289bc588SBarry Smith /* -------------------------------------------------------------------*/ 1576a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense, 1577905e6a2fSBarry Smith MatGetRow_SeqDense, 1578905e6a2fSBarry Smith MatRestoreRow_SeqDense, 1579905e6a2fSBarry Smith MatMult_SeqDense, 158097304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense, 15817c922b88SBarry Smith MatMultTranspose_SeqDense, 15827c922b88SBarry Smith MatMultTransposeAdd_SeqDense, 1583905e6a2fSBarry Smith MatSolve_SeqDense, 1584905e6a2fSBarry Smith MatSolveAdd_SeqDense, 15857c922b88SBarry Smith MatSolveTranspose_SeqDense, 158697304618SKris Buschelman /*10*/ MatSolveTransposeAdd_SeqDense, 1587905e6a2fSBarry Smith MatLUFactor_SeqDense, 1588905e6a2fSBarry Smith MatCholeskyFactor_SeqDense, 1589ec8511deSBarry Smith MatRelax_SeqDense, 1590ec8511deSBarry Smith MatTranspose_SeqDense, 159197304618SKris Buschelman /*15*/ MatGetInfo_SeqDense, 1592905e6a2fSBarry Smith MatEqual_SeqDense, 1593905e6a2fSBarry Smith MatGetDiagonal_SeqDense, 1594905e6a2fSBarry Smith MatDiagonalScale_SeqDense, 1595905e6a2fSBarry Smith MatNorm_SeqDense, 1596c0aa2d19SHong Zhang /*20*/ MatAssemblyBegin_SeqDense, 1597c0aa2d19SHong Zhang MatAssemblyEnd_SeqDense, 1598905e6a2fSBarry Smith 0, 1599905e6a2fSBarry Smith MatSetOption_SeqDense, 1600905e6a2fSBarry Smith MatZeroEntries_SeqDense, 160197304618SKris Buschelman /*25*/ MatZeroRows_SeqDense, 1602905e6a2fSBarry Smith MatLUFactorSymbolic_SeqDense, 1603905e6a2fSBarry Smith MatLUFactorNumeric_SeqDense, 1604905e6a2fSBarry Smith MatCholeskyFactorSymbolic_SeqDense, 1605905e6a2fSBarry Smith MatCholeskyFactorNumeric_SeqDense, 160697304618SKris Buschelman /*30*/ MatSetUpPreallocation_SeqDense, 1607273d9f13SBarry Smith 0, 1608905e6a2fSBarry Smith 0, 1609905e6a2fSBarry Smith MatGetArray_SeqDense, 1610905e6a2fSBarry Smith MatRestoreArray_SeqDense, 161197304618SKris Buschelman /*35*/ MatDuplicate_SeqDense, 1612a5ae1ecdSBarry Smith 0, 1613a5ae1ecdSBarry Smith 0, 1614a5ae1ecdSBarry Smith 0, 1615a5ae1ecdSBarry Smith 0, 161697304618SKris Buschelman /*40*/ MatAXPY_SeqDense, 1617a5ae1ecdSBarry Smith MatGetSubMatrices_SeqDense, 1618a5ae1ecdSBarry Smith 0, 16194b0e389bSBarry Smith MatGetValues_SeqDense, 1620a5ae1ecdSBarry Smith MatCopy_SeqDense, 162197304618SKris Buschelman /*45*/ 0, 1622a5ae1ecdSBarry Smith MatScale_SeqDense, 1623a5ae1ecdSBarry Smith 0, 1624a5ae1ecdSBarry Smith 0, 1625a5ae1ecdSBarry Smith 0, 1626521d7252SBarry Smith /*50*/ 0, 1627a5ae1ecdSBarry Smith 0, 1628a5ae1ecdSBarry Smith 0, 1629a5ae1ecdSBarry Smith 0, 1630a5ae1ecdSBarry Smith 0, 163197304618SKris Buschelman /*55*/ 0, 1632a5ae1ecdSBarry Smith 0, 1633a5ae1ecdSBarry Smith 0, 1634a5ae1ecdSBarry Smith 0, 1635a5ae1ecdSBarry Smith 0, 163697304618SKris Buschelman /*60*/ 0, 1637e03a110bSBarry Smith MatDestroy_SeqDense, 1638e03a110bSBarry Smith MatView_SeqDense, 163997304618SKris Buschelman MatGetPetscMaps_Petsc, 164097304618SKris Buschelman 0, 164197304618SKris Buschelman /*65*/ 0, 164297304618SKris Buschelman 0, 164397304618SKris Buschelman 0, 164497304618SKris Buschelman 0, 164597304618SKris Buschelman 0, 164697304618SKris Buschelman /*70*/ 0, 164797304618SKris Buschelman 0, 164897304618SKris Buschelman 0, 164997304618SKris Buschelman 0, 165097304618SKris Buschelman 0, 165197304618SKris Buschelman /*75*/ 0, 165297304618SKris Buschelman 0, 165397304618SKris Buschelman 0, 165497304618SKris Buschelman 0, 165597304618SKris Buschelman 0, 165697304618SKris Buschelman /*80*/ 0, 165797304618SKris Buschelman 0, 165897304618SKris Buschelman 0, 165997304618SKris Buschelman 0, 1660865e5f61SKris Buschelman /*84*/ MatLoad_SeqDense, 1661865e5f61SKris Buschelman 0, 1662865e5f61SKris Buschelman 0, 1663865e5f61SKris Buschelman 0, 1664865e5f61SKris Buschelman 0, 1665865e5f61SKris Buschelman 0, 1666a9fe9ddaSSatish Balay /*90*/ MatMatMult_SeqDense_SeqDense, 1667a9fe9ddaSSatish Balay MatMatMultSymbolic_SeqDense_SeqDense, 1668a9fe9ddaSSatish Balay MatMatMultNumeric_SeqDense_SeqDense, 1669865e5f61SKris Buschelman 0, 1670865e5f61SKris Buschelman 0, 1671865e5f61SKris Buschelman /*95*/ 0, 1672a9fe9ddaSSatish Balay MatMatMultTranspose_SeqDense_SeqDense, 1673a9fe9ddaSSatish Balay MatMatMultTransposeSymbolic_SeqDense_SeqDense, 1674a9fe9ddaSSatish Balay MatMatMultTransposeNumeric_SeqDense_SeqDense, 1675284134d9SBarry Smith 0, 1676284134d9SBarry Smith /*100*/0, 1677284134d9SBarry Smith 0, 1678284134d9SBarry Smith 0, 1679284134d9SBarry Smith 0, 1680284134d9SBarry Smith MatSetSizes_SeqDense}; 168190ace30eSBarry Smith 16824a2ae208SSatish Balay #undef __FUNCT__ 16834a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense" 16844b828684SBarry Smith /*@C 1685fafbff53SBarry Smith MatCreateSeqDense - Creates a sequential dense matrix that 1686d65003e9SLois Curfman McInnes is stored in column major order (the usual Fortran 77 manner). Many 1687d65003e9SLois Curfman McInnes of the matrix operations use the BLAS and LAPACK routines. 1688289bc588SBarry Smith 1689db81eaa0SLois Curfman McInnes Collective on MPI_Comm 1690db81eaa0SLois Curfman McInnes 169120563c6bSBarry Smith Input Parameters: 1692db81eaa0SLois Curfman McInnes + comm - MPI communicator, set to PETSC_COMM_SELF 16930c775827SLois Curfman McInnes . m - number of rows 169418f449edSLois Curfman McInnes . n - number of columns 1695db81eaa0SLois Curfman McInnes - data - optional location of matrix data. Set data=PETSC_NULL for PETSc 1696dfc5480cSLois Curfman McInnes to control all matrix memory allocation. 169720563c6bSBarry Smith 169820563c6bSBarry Smith Output Parameter: 169944cd7ae7SLois Curfman McInnes . A - the matrix 170020563c6bSBarry Smith 1701b259b22eSLois Curfman McInnes Notes: 170218f449edSLois Curfman McInnes The data input variable is intended primarily for Fortran programmers 170318f449edSLois Curfman McInnes who wish to allocate their own matrix memory space. Most users should 1704b4fd4287SBarry Smith set data=PETSC_NULL. 170518f449edSLois Curfman McInnes 1706027ccd11SLois Curfman McInnes Level: intermediate 1707027ccd11SLois Curfman McInnes 1708dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS 1709d65003e9SLois Curfman McInnes 1710db81eaa0SLois Curfman McInnes .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues() 171120563c6bSBarry Smith @*/ 1712be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A) 1713289bc588SBarry Smith { 1714dfbe8321SBarry Smith PetscErrorCode ierr; 17153b2fbd54SBarry Smith 17163a40ed3dSBarry Smith PetscFunctionBegin; 1717f69a0ea3SMatthew Knepley ierr = MatCreate(comm,A);CHKERRQ(ierr); 1718f69a0ea3SMatthew Knepley ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr); 1719273d9f13SBarry Smith ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr); 1720273d9f13SBarry Smith ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr); 1721273d9f13SBarry Smith PetscFunctionReturn(0); 1722273d9f13SBarry Smith } 1723273d9f13SBarry Smith 17244a2ae208SSatish Balay #undef __FUNCT__ 17254a2ae208SSatish Balay #define __FUNCT__ "MatSeqDensePreallocation" 1726273d9f13SBarry Smith /*@C 1727273d9f13SBarry Smith MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements 1728273d9f13SBarry Smith 1729273d9f13SBarry Smith Collective on MPI_Comm 1730273d9f13SBarry Smith 1731273d9f13SBarry Smith Input Parameters: 1732273d9f13SBarry Smith + A - the matrix 1733273d9f13SBarry Smith - data - the array (or PETSC_NULL) 1734273d9f13SBarry Smith 1735273d9f13SBarry Smith Notes: 1736273d9f13SBarry Smith The data input variable is intended primarily for Fortran programmers 1737273d9f13SBarry Smith who wish to allocate their own matrix memory space. Most users should 1738284134d9SBarry Smith need not call this routine. 1739273d9f13SBarry Smith 1740273d9f13SBarry Smith Level: intermediate 1741273d9f13SBarry Smith 1742273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS 1743273d9f13SBarry Smith 1744273d9f13SBarry Smith .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues() 1745273d9f13SBarry Smith @*/ 1746be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation(Mat B,PetscScalar data[]) 1747273d9f13SBarry Smith { 1748dfbe8321SBarry Smith PetscErrorCode ierr,(*f)(Mat,PetscScalar[]); 1749a23d5eceSKris Buschelman 1750a23d5eceSKris Buschelman PetscFunctionBegin; 1751a23d5eceSKris Buschelman ierr = PetscObjectQueryFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",(void (**)(void))&f);CHKERRQ(ierr); 1752a23d5eceSKris Buschelman if (f) { 1753a23d5eceSKris Buschelman ierr = (*f)(B,data);CHKERRQ(ierr); 1754a23d5eceSKris Buschelman } 1755a23d5eceSKris Buschelman PetscFunctionReturn(0); 1756a23d5eceSKris Buschelman } 1757a23d5eceSKris Buschelman 1758a23d5eceSKris Buschelman EXTERN_C_BEGIN 1759a23d5eceSKris Buschelman #undef __FUNCT__ 1760a23d5eceSKris Buschelman #define __FUNCT__ "MatSeqDensePreallocation_SeqDense" 1761be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data) 1762a23d5eceSKris Buschelman { 1763273d9f13SBarry Smith Mat_SeqDense *b; 1764dfbe8321SBarry Smith PetscErrorCode ierr; 1765273d9f13SBarry Smith 1766273d9f13SBarry Smith PetscFunctionBegin; 1767273d9f13SBarry Smith B->preallocated = PETSC_TRUE; 1768273d9f13SBarry Smith b = (Mat_SeqDense*)B->data; 1769273d9f13SBarry Smith if (!data) { 1770284134d9SBarry Smith ierr = PetscMalloc((b->lda*b->Nmax+1)*sizeof(PetscScalar),&b->v);CHKERRQ(ierr); 1771284134d9SBarry Smith ierr = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 1772273d9f13SBarry Smith b->user_alloc = PETSC_FALSE; 1773284134d9SBarry Smith ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr); 1774273d9f13SBarry Smith } else { /* user-allocated storage */ 1775273d9f13SBarry Smith b->v = data; 1776273d9f13SBarry Smith b->user_alloc = PETSC_TRUE; 1777273d9f13SBarry Smith } 1778273d9f13SBarry Smith PetscFunctionReturn(0); 1779273d9f13SBarry Smith } 1780a23d5eceSKris Buschelman EXTERN_C_END 1781273d9f13SBarry Smith 17821b807ce4Svictorle #undef __FUNCT__ 17831b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA" 17841b807ce4Svictorle /*@C 17851b807ce4Svictorle MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array 17861b807ce4Svictorle 17871b807ce4Svictorle Input parameter: 17881b807ce4Svictorle + A - the matrix 17891b807ce4Svictorle - lda - the leading dimension 17901b807ce4Svictorle 17911b807ce4Svictorle Notes: 17921b807ce4Svictorle This routine is to be used in conjunction with MatSeqDenseSetPreallocation; 17931b807ce4Svictorle it asserts that the preallocation has a leading dimension (the LDA parameter 17941b807ce4Svictorle of Blas and Lapack fame) larger than M, the first dimension of the matrix. 17951b807ce4Svictorle 17961b807ce4Svictorle Level: intermediate 17971b807ce4Svictorle 17981b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS 17991b807ce4Svictorle 1800284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize() 18011b807ce4Svictorle @*/ 1802be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetLDA(Mat B,PetscInt lda) 18031b807ce4Svictorle { 18041b807ce4Svictorle Mat_SeqDense *b = (Mat_SeqDense*)B->data; 180521a2c019SBarry Smith 18061b807ce4Svictorle PetscFunctionBegin; 180777431f27SBarry Smith if (lda < B->m) SETERRQ2(PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->m); 18081b807ce4Svictorle b->lda = lda; 180921a2c019SBarry Smith b->changelda = PETSC_FALSE; 181021a2c019SBarry Smith b->Mmax = PetscMax(b->Mmax,lda); 18111b807ce4Svictorle PetscFunctionReturn(0); 18121b807ce4Svictorle } 18131b807ce4Svictorle 18140bad9183SKris Buschelman /*MC 1815fafad747SKris Buschelman MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices. 18160bad9183SKris Buschelman 18170bad9183SKris Buschelman Options Database Keys: 18180bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions() 18190bad9183SKris Buschelman 18200bad9183SKris Buschelman Level: beginner 18210bad9183SKris Buschelman 182289665df3SBarry Smith .seealso: MatCreateSeqDense() 182389665df3SBarry Smith 18240bad9183SKris Buschelman M*/ 18250bad9183SKris Buschelman 1826273d9f13SBarry Smith EXTERN_C_BEGIN 18274a2ae208SSatish Balay #undef __FUNCT__ 18284a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense" 1829be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreate_SeqDense(Mat B) 1830273d9f13SBarry Smith { 1831273d9f13SBarry Smith Mat_SeqDense *b; 1832dfbe8321SBarry Smith PetscErrorCode ierr; 18337c334f02SBarry Smith PetscMPIInt size; 1834273d9f13SBarry Smith 1835273d9f13SBarry Smith PetscFunctionBegin; 1836273d9f13SBarry Smith ierr = MPI_Comm_size(B->comm,&size);CHKERRQ(ierr); 183729bbc08cSBarry Smith if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"Comm must be of size 1"); 183855659b69SBarry Smith 1839273d9f13SBarry Smith B->m = B->M = PetscMax(B->m,B->M); 1840273d9f13SBarry Smith B->n = B->N = PetscMax(B->n,B->N); 1841273d9f13SBarry Smith 1842b0a32e0cSBarry Smith ierr = PetscNew(Mat_SeqDense,&b);CHKERRQ(ierr); 1843549d3d68SSatish Balay ierr = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr); 184444cd7ae7SLois Curfman McInnes B->factor = 0; 184590f02eecSBarry Smith B->mapping = 0; 184652e6d16bSBarry Smith ierr = PetscLogObjectMemory(B,sizeof(struct _p_Mat));CHKERRQ(ierr); 184744cd7ae7SLois Curfman McInnes B->data = (void*)b; 184818f449edSLois Curfman McInnes 18498a124369SBarry Smith ierr = PetscMapCreateMPI(B->comm,B->m,B->m,&B->rmap);CHKERRQ(ierr); 18508a124369SBarry Smith ierr = PetscMapCreateMPI(B->comm,B->n,B->n,&B->cmap);CHKERRQ(ierr); 1851a5ae1ecdSBarry Smith 185244cd7ae7SLois Curfman McInnes b->pivots = 0; 1853273d9f13SBarry Smith b->roworiented = PETSC_TRUE; 1854273d9f13SBarry Smith b->v = 0; 18551b807ce4Svictorle b->lda = B->m; 185621a2c019SBarry Smith b->changelda = PETSC_FALSE; 185721a2c019SBarry Smith b->Mmax = B->m; 1858284134d9SBarry Smith b->Nmax = B->n; 18594e220ebcSLois Curfman McInnes 1860a23d5eceSKris Buschelman ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C", 1861a23d5eceSKris Buschelman "MatSeqDenseSetPreallocation_SeqDense", 1862a23d5eceSKris Buschelman MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr); 18633a40ed3dSBarry Smith PetscFunctionReturn(0); 1864289bc588SBarry Smith } 1865c0aa2d19SHong Zhang 1866c0aa2d19SHong Zhang 1867273d9f13SBarry Smith EXTERN_C_END 1868