xref: /petsc/src/mat/impls/dense/seq/dense.c (revision 6de62eee4527598f174c599a17ab048534b7e2c3)
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 {
37*6de62eeeSBarry 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;
46*6de62eeeSBarry Smith   info->nz_used           = (double)N;
47*6de62eeeSBarry 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) {
77277431f27SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
773329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
77477431f27SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,PetscRealPart(*v));CHKERRQ(ierr);
7756831982aSBarry Smith         }
77680cd9d93SLois Curfman McInnes #else
7776831982aSBarry Smith         if (*v) {
77877431f27SBarry 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:
125763ba0a88SBarry Smith     ierr = PetscLogInfo((A,"MatSetOption_SeqDense: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;
132264e87e97SBarry Smith   *array = mat->v;
13233a40ed3dSBarry Smith   PetscFunctionReturn(0);
132464e87e97SBarry Smith }
13250754003eSLois Curfman McInnes 
13264a2ae208SSatish Balay #undef __FUNCT__
13274a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense"
1328dfbe8321SBarry Smith PetscErrorCode MatRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1329ff14e315SSatish Balay {
13303a40ed3dSBarry Smith   PetscFunctionBegin;
133109b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
13323a40ed3dSBarry Smith   PetscFunctionReturn(0);
1333ff14e315SSatish Balay }
13340754003eSLois Curfman McInnes 
13354a2ae208SSatish Balay #undef __FUNCT__
13364a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
133713f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
13380754003eSLois Curfman McInnes {
1339c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
13406849ba73SBarry Smith   PetscErrorCode ierr;
134113f74950SBarry Smith   PetscInt       i,j,m = A->m,*irow,*icol,nrows,ncols;
134287828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
13430754003eSLois Curfman McInnes   Mat            newmat;
13440754003eSLois Curfman McInnes 
13453a40ed3dSBarry Smith   PetscFunctionBegin;
134678b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
134778b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1348e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1349e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
13500754003eSLois Curfman McInnes 
1351182d2002SSatish Balay   /* Check submatrixcall */
1352182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
135313f74950SBarry Smith     PetscInt n_cols,n_rows;
1354182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
135529bbc08cSBarry Smith     if (n_rows != nrows || n_cols != ncols) SETERRQ(PETSC_ERR_ARG_SIZ,"Reused submatrix wrong size");
1356182d2002SSatish Balay     newmat = *B;
1357182d2002SSatish Balay   } else {
13580754003eSLois Curfman McInnes     /* Create and fill new matrix */
1359f69a0ea3SMatthew Knepley     ierr = MatCreate(A->comm,&newmat);CHKERRQ(ierr);
1360f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
13615c5985e7SKris Buschelman     ierr = MatSetType(newmat,A->type_name);CHKERRQ(ierr);
13625c5985e7SKris Buschelman     ierr = MatSeqDenseSetPreallocation(newmat,PETSC_NULL);CHKERRQ(ierr);
1363182d2002SSatish Balay   }
1364182d2002SSatish Balay 
1365182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1366182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1367182d2002SSatish Balay 
1368182d2002SSatish Balay   for (i=0; i<ncols; i++) {
1369*6de62eeeSBarry Smith     av = v + mat->lda*icol[i];
1370182d2002SSatish Balay     for (j=0; j<nrows; j++) {
1371182d2002SSatish Balay       *bv++ = av[irow[j]];
13720754003eSLois Curfman McInnes     }
13730754003eSLois Curfman McInnes   }
1374182d2002SSatish Balay 
1375182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
13766d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
13776d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
13780754003eSLois Curfman McInnes 
13790754003eSLois Curfman McInnes   /* Free work space */
138078b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
138178b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1382182d2002SSatish Balay   *B = newmat;
13833a40ed3dSBarry Smith   PetscFunctionReturn(0);
13840754003eSLois Curfman McInnes }
13850754003eSLois Curfman McInnes 
13864a2ae208SSatish Balay #undef __FUNCT__
13874a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
138813f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1389905e6a2fSBarry Smith {
13906849ba73SBarry Smith   PetscErrorCode ierr;
139113f74950SBarry Smith   PetscInt       i;
1392905e6a2fSBarry Smith 
13933a40ed3dSBarry Smith   PetscFunctionBegin;
1394905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1395b0a32e0cSBarry Smith     ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr);
1396905e6a2fSBarry Smith   }
1397905e6a2fSBarry Smith 
1398905e6a2fSBarry Smith   for (i=0; i<n; i++) {
13996a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1400905e6a2fSBarry Smith   }
14013a40ed3dSBarry Smith   PetscFunctionReturn(0);
1402905e6a2fSBarry Smith }
1403905e6a2fSBarry Smith 
14044a2ae208SSatish Balay #undef __FUNCT__
14054a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1406dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
14074b0e389bSBarry Smith {
14084b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data;
14096849ba73SBarry Smith   PetscErrorCode ierr;
141013f74950SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->m,n=A->n, j;
14113a40ed3dSBarry Smith 
14123a40ed3dSBarry Smith   PetscFunctionBegin;
141333f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
141433f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1415cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
14163a40ed3dSBarry Smith     PetscFunctionReturn(0);
14173a40ed3dSBarry Smith   }
14180dbb7854Svictorle   if (m != B->m || n != B->n) SETERRQ(PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1419a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
14200dbb7854Svictorle     for (j=0; j<n; j++) {
1421a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1422a5ce6ee0Svictorle     }
1423a5ce6ee0Svictorle   } else {
142487828ca2SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->m*A->n*sizeof(PetscScalar));CHKERRQ(ierr);
1425a5ce6ee0Svictorle   }
1426273d9f13SBarry Smith   PetscFunctionReturn(0);
1427273d9f13SBarry Smith }
1428273d9f13SBarry Smith 
14294a2ae208SSatish Balay #undef __FUNCT__
14304a2ae208SSatish Balay #define __FUNCT__ "MatSetUpPreallocation_SeqDense"
1431dfbe8321SBarry Smith PetscErrorCode MatSetUpPreallocation_SeqDense(Mat A)
1432273d9f13SBarry Smith {
1433dfbe8321SBarry Smith   PetscErrorCode ierr;
1434273d9f13SBarry Smith 
1435273d9f13SBarry Smith   PetscFunctionBegin;
1436273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
14373a40ed3dSBarry Smith   PetscFunctionReturn(0);
14384b0e389bSBarry Smith }
14394b0e389bSBarry Smith 
1440284134d9SBarry Smith #undef __FUNCT__
1441284134d9SBarry Smith #define __FUNCT__ "MatSetSizes_SeqDense"
1442284134d9SBarry Smith PetscErrorCode MatSetSizes_SeqDense(Mat A,PetscInt m,PetscInt n,PetscInt M,PetscInt N)
1443284134d9SBarry Smith {
1444284134d9SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1445284134d9SBarry Smith 
1446284134d9SBarry Smith   PetscFunctionBegin;
1447284134d9SBarry Smith   /* this will not be called before lda and Nmax have been set */
1448284134d9SBarry Smith   m = PetscMax(m,M);
1449284134d9SBarry Smith   n = PetscMax(n,N);
1450284134d9SBarry Smith   if (m > a->lda) SETERRQ2(PETSC_ERR_SUP,"Cannot yet resize number rows of dense matrix larger then its initial size %d, requested %d",a->lda,(int)m);
1451284134d9SBarry 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);
1452284134d9SBarry Smith   A->m = A->M = m;
1453284134d9SBarry Smith   A->n = A->N = n;
1454284134d9SBarry Smith   PetscFunctionReturn(0);
1455284134d9SBarry Smith }
1456284134d9SBarry Smith 
1457289bc588SBarry Smith /* -------------------------------------------------------------------*/
1458a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense,
1459905e6a2fSBarry Smith        MatGetRow_SeqDense,
1460905e6a2fSBarry Smith        MatRestoreRow_SeqDense,
1461905e6a2fSBarry Smith        MatMult_SeqDense,
146297304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense,
14637c922b88SBarry Smith        MatMultTranspose_SeqDense,
14647c922b88SBarry Smith        MatMultTransposeAdd_SeqDense,
1465905e6a2fSBarry Smith        MatSolve_SeqDense,
1466905e6a2fSBarry Smith        MatSolveAdd_SeqDense,
14677c922b88SBarry Smith        MatSolveTranspose_SeqDense,
146897304618SKris Buschelman /*10*/ MatSolveTransposeAdd_SeqDense,
1469905e6a2fSBarry Smith        MatLUFactor_SeqDense,
1470905e6a2fSBarry Smith        MatCholeskyFactor_SeqDense,
1471ec8511deSBarry Smith        MatRelax_SeqDense,
1472ec8511deSBarry Smith        MatTranspose_SeqDense,
147397304618SKris Buschelman /*15*/ MatGetInfo_SeqDense,
1474905e6a2fSBarry Smith        MatEqual_SeqDense,
1475905e6a2fSBarry Smith        MatGetDiagonal_SeqDense,
1476905e6a2fSBarry Smith        MatDiagonalScale_SeqDense,
1477905e6a2fSBarry Smith        MatNorm_SeqDense,
147897304618SKris Buschelman /*20*/ 0,
1479905e6a2fSBarry Smith        0,
1480905e6a2fSBarry Smith        0,
1481905e6a2fSBarry Smith        MatSetOption_SeqDense,
1482905e6a2fSBarry Smith        MatZeroEntries_SeqDense,
148397304618SKris Buschelman /*25*/ MatZeroRows_SeqDense,
1484905e6a2fSBarry Smith        MatLUFactorSymbolic_SeqDense,
1485905e6a2fSBarry Smith        MatLUFactorNumeric_SeqDense,
1486905e6a2fSBarry Smith        MatCholeskyFactorSymbolic_SeqDense,
1487905e6a2fSBarry Smith        MatCholeskyFactorNumeric_SeqDense,
148897304618SKris Buschelman /*30*/ MatSetUpPreallocation_SeqDense,
1489273d9f13SBarry Smith        0,
1490905e6a2fSBarry Smith        0,
1491905e6a2fSBarry Smith        MatGetArray_SeqDense,
1492905e6a2fSBarry Smith        MatRestoreArray_SeqDense,
149397304618SKris Buschelman /*35*/ MatDuplicate_SeqDense,
1494a5ae1ecdSBarry Smith        0,
1495a5ae1ecdSBarry Smith        0,
1496a5ae1ecdSBarry Smith        0,
1497a5ae1ecdSBarry Smith        0,
149897304618SKris Buschelman /*40*/ MatAXPY_SeqDense,
1499a5ae1ecdSBarry Smith        MatGetSubMatrices_SeqDense,
1500a5ae1ecdSBarry Smith        0,
15014b0e389bSBarry Smith        MatGetValues_SeqDense,
1502a5ae1ecdSBarry Smith        MatCopy_SeqDense,
150397304618SKris Buschelman /*45*/ 0,
1504a5ae1ecdSBarry Smith        MatScale_SeqDense,
1505a5ae1ecdSBarry Smith        0,
1506a5ae1ecdSBarry Smith        0,
1507a5ae1ecdSBarry Smith        0,
1508521d7252SBarry Smith /*50*/ 0,
1509a5ae1ecdSBarry Smith        0,
1510a5ae1ecdSBarry Smith        0,
1511a5ae1ecdSBarry Smith        0,
1512a5ae1ecdSBarry Smith        0,
151397304618SKris Buschelman /*55*/ 0,
1514a5ae1ecdSBarry Smith        0,
1515a5ae1ecdSBarry Smith        0,
1516a5ae1ecdSBarry Smith        0,
1517a5ae1ecdSBarry Smith        0,
151897304618SKris Buschelman /*60*/ 0,
1519e03a110bSBarry Smith        MatDestroy_SeqDense,
1520e03a110bSBarry Smith        MatView_SeqDense,
152197304618SKris Buschelman        MatGetPetscMaps_Petsc,
152297304618SKris Buschelman        0,
152397304618SKris Buschelman /*65*/ 0,
152497304618SKris Buschelman        0,
152597304618SKris Buschelman        0,
152697304618SKris Buschelman        0,
152797304618SKris Buschelman        0,
152897304618SKris Buschelman /*70*/ 0,
152997304618SKris Buschelman        0,
153097304618SKris Buschelman        0,
153197304618SKris Buschelman        0,
153297304618SKris Buschelman        0,
153397304618SKris Buschelman /*75*/ 0,
153497304618SKris Buschelman        0,
153597304618SKris Buschelman        0,
153697304618SKris Buschelman        0,
153797304618SKris Buschelman        0,
153897304618SKris Buschelman /*80*/ 0,
153997304618SKris Buschelman        0,
154097304618SKris Buschelman        0,
154197304618SKris Buschelman        0,
1542865e5f61SKris Buschelman /*84*/ MatLoad_SeqDense,
1543865e5f61SKris Buschelman        0,
1544865e5f61SKris Buschelman        0,
1545865e5f61SKris Buschelman        0,
1546865e5f61SKris Buschelman        0,
1547865e5f61SKris Buschelman        0,
1548865e5f61SKris Buschelman /*90*/ 0,
1549865e5f61SKris Buschelman        0,
1550865e5f61SKris Buschelman        0,
1551865e5f61SKris Buschelman        0,
1552865e5f61SKris Buschelman        0,
1553865e5f61SKris Buschelman /*95*/ 0,
1554865e5f61SKris Buschelman        0,
1555865e5f61SKris Buschelman        0,
1556284134d9SBarry Smith        0,
1557284134d9SBarry Smith        0,
1558284134d9SBarry Smith /*100*/0,
1559284134d9SBarry Smith        0,
1560284134d9SBarry Smith        0,
1561284134d9SBarry Smith        0,
1562284134d9SBarry Smith        MatSetSizes_SeqDense};
156390ace30eSBarry Smith 
15644a2ae208SSatish Balay #undef __FUNCT__
15654a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
15664b828684SBarry Smith /*@C
1567fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
1568d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
1569d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
1570289bc588SBarry Smith 
1571db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
1572db81eaa0SLois Curfman McInnes 
157320563c6bSBarry Smith    Input Parameters:
1574db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
15750c775827SLois Curfman McInnes .  m - number of rows
157618f449edSLois Curfman McInnes .  n - number of columns
1577db81eaa0SLois Curfman McInnes -  data - optional location of matrix data.  Set data=PETSC_NULL for PETSc
1578dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
157920563c6bSBarry Smith 
158020563c6bSBarry Smith    Output Parameter:
158144cd7ae7SLois Curfman McInnes .  A - the matrix
158220563c6bSBarry Smith 
1583b259b22eSLois Curfman McInnes    Notes:
158418f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
158518f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
1586b4fd4287SBarry Smith    set data=PETSC_NULL.
158718f449edSLois Curfman McInnes 
1588027ccd11SLois Curfman McInnes    Level: intermediate
1589027ccd11SLois Curfman McInnes 
1590dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
1591d65003e9SLois Curfman McInnes 
1592db81eaa0SLois Curfman McInnes .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues()
159320563c6bSBarry Smith @*/
1594be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
1595289bc588SBarry Smith {
1596dfbe8321SBarry Smith   PetscErrorCode ierr;
15973b2fbd54SBarry Smith 
15983a40ed3dSBarry Smith   PetscFunctionBegin;
1599f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
1600f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
1601273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
1602273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
1603273d9f13SBarry Smith   PetscFunctionReturn(0);
1604273d9f13SBarry Smith }
1605273d9f13SBarry Smith 
16064a2ae208SSatish Balay #undef __FUNCT__
16074a2ae208SSatish Balay #define __FUNCT__ "MatSeqDensePreallocation"
1608273d9f13SBarry Smith /*@C
1609273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
1610273d9f13SBarry Smith 
1611273d9f13SBarry Smith    Collective on MPI_Comm
1612273d9f13SBarry Smith 
1613273d9f13SBarry Smith    Input Parameters:
1614273d9f13SBarry Smith +  A - the matrix
1615273d9f13SBarry Smith -  data - the array (or PETSC_NULL)
1616273d9f13SBarry Smith 
1617273d9f13SBarry Smith    Notes:
1618273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
1619273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
1620284134d9SBarry Smith    need not call this routine.
1621273d9f13SBarry Smith 
1622273d9f13SBarry Smith    Level: intermediate
1623273d9f13SBarry Smith 
1624273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
1625273d9f13SBarry Smith 
1626273d9f13SBarry Smith .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues()
1627273d9f13SBarry Smith @*/
1628be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
1629273d9f13SBarry Smith {
1630dfbe8321SBarry Smith   PetscErrorCode ierr,(*f)(Mat,PetscScalar[]);
1631a23d5eceSKris Buschelman 
1632a23d5eceSKris Buschelman   PetscFunctionBegin;
1633a23d5eceSKris Buschelman   ierr = PetscObjectQueryFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",(void (**)(void))&f);CHKERRQ(ierr);
1634a23d5eceSKris Buschelman   if (f) {
1635a23d5eceSKris Buschelman     ierr = (*f)(B,data);CHKERRQ(ierr);
1636a23d5eceSKris Buschelman   }
1637a23d5eceSKris Buschelman   PetscFunctionReturn(0);
1638a23d5eceSKris Buschelman }
1639a23d5eceSKris Buschelman 
1640a23d5eceSKris Buschelman EXTERN_C_BEGIN
1641a23d5eceSKris Buschelman #undef __FUNCT__
1642a23d5eceSKris Buschelman #define __FUNCT__ "MatSeqDensePreallocation_SeqDense"
1643be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
1644a23d5eceSKris Buschelman {
1645273d9f13SBarry Smith   Mat_SeqDense   *b;
1646dfbe8321SBarry Smith   PetscErrorCode ierr;
1647273d9f13SBarry Smith 
1648273d9f13SBarry Smith   PetscFunctionBegin;
1649273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
1650273d9f13SBarry Smith   b               = (Mat_SeqDense*)B->data;
1651273d9f13SBarry Smith   if (!data) {
1652284134d9SBarry Smith     ierr          = PetscMalloc((b->lda*b->Nmax+1)*sizeof(PetscScalar),&b->v);CHKERRQ(ierr);
1653284134d9SBarry Smith     ierr          = PetscMemzero(b->v,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
1654273d9f13SBarry Smith     b->user_alloc = PETSC_FALSE;
1655284134d9SBarry Smith     ierr = PetscLogObjectMemory(B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
1656273d9f13SBarry Smith   } else { /* user-allocated storage */
1657273d9f13SBarry Smith     b->v          = data;
1658273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
1659273d9f13SBarry Smith   }
1660273d9f13SBarry Smith   PetscFunctionReturn(0);
1661273d9f13SBarry Smith }
1662a23d5eceSKris Buschelman EXTERN_C_END
1663273d9f13SBarry Smith 
16641b807ce4Svictorle #undef __FUNCT__
16651b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
16661b807ce4Svictorle /*@C
16671b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
16681b807ce4Svictorle 
16691b807ce4Svictorle   Input parameter:
16701b807ce4Svictorle + A - the matrix
16711b807ce4Svictorle - lda - the leading dimension
16721b807ce4Svictorle 
16731b807ce4Svictorle   Notes:
16741b807ce4Svictorle   This routine is to be used in conjunction with MatSeqDenseSetPreallocation;
16751b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
16761b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
16771b807ce4Svictorle 
16781b807ce4Svictorle   Level: intermediate
16791b807ce4Svictorle 
16801b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
16811b807ce4Svictorle 
1682284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
16831b807ce4Svictorle @*/
1684be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatSeqDenseSetLDA(Mat B,PetscInt lda)
16851b807ce4Svictorle {
16861b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
16871b807ce4Svictorle   PetscFunctionBegin;
168877431f27SBarry Smith   if (lda < B->m) SETERRQ2(PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->m);
16891b807ce4Svictorle   b->lda = lda;
16901b807ce4Svictorle   PetscFunctionReturn(0);
16911b807ce4Svictorle }
16921b807ce4Svictorle 
16930bad9183SKris Buschelman /*MC
1694fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
16950bad9183SKris Buschelman 
16960bad9183SKris Buschelman    Options Database Keys:
16970bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
16980bad9183SKris Buschelman 
16990bad9183SKris Buschelman   Level: beginner
17000bad9183SKris Buschelman 
170189665df3SBarry Smith .seealso: MatCreateSeqDense()
170289665df3SBarry Smith 
17030bad9183SKris Buschelman M*/
17040bad9183SKris Buschelman 
1705273d9f13SBarry Smith EXTERN_C_BEGIN
17064a2ae208SSatish Balay #undef __FUNCT__
17074a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
1708be1d678aSKris Buschelman PetscErrorCode PETSCMAT_DLLEXPORT MatCreate_SeqDense(Mat B)
1709273d9f13SBarry Smith {
1710273d9f13SBarry Smith   Mat_SeqDense   *b;
1711dfbe8321SBarry Smith   PetscErrorCode ierr;
17127c334f02SBarry Smith   PetscMPIInt    size;
1713273d9f13SBarry Smith 
1714273d9f13SBarry Smith   PetscFunctionBegin;
1715273d9f13SBarry Smith   ierr = MPI_Comm_size(B->comm,&size);CHKERRQ(ierr);
171629bbc08cSBarry Smith   if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
171755659b69SBarry Smith 
1718273d9f13SBarry Smith   B->m = B->M = PetscMax(B->m,B->M);
1719273d9f13SBarry Smith   B->n = B->N = PetscMax(B->n,B->N);
1720273d9f13SBarry Smith 
1721b0a32e0cSBarry Smith   ierr            = PetscNew(Mat_SeqDense,&b);CHKERRQ(ierr);
1722549d3d68SSatish Balay   ierr            = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
172344cd7ae7SLois Curfman McInnes   B->factor       = 0;
172490f02eecSBarry Smith   B->mapping      = 0;
172552e6d16bSBarry Smith   ierr = PetscLogObjectMemory(B,sizeof(struct _p_Mat));CHKERRQ(ierr);
172644cd7ae7SLois Curfman McInnes   B->data         = (void*)b;
172718f449edSLois Curfman McInnes 
17288a124369SBarry Smith   ierr = PetscMapCreateMPI(B->comm,B->m,B->m,&B->rmap);CHKERRQ(ierr);
17298a124369SBarry Smith   ierr = PetscMapCreateMPI(B->comm,B->n,B->n,&B->cmap);CHKERRQ(ierr);
1730a5ae1ecdSBarry Smith 
173144cd7ae7SLois Curfman McInnes   b->pivots       = 0;
1732273d9f13SBarry Smith   b->roworiented  = PETSC_TRUE;
1733273d9f13SBarry Smith   b->v            = 0;
17341b807ce4Svictorle   b->lda          = B->m;
1735284134d9SBarry Smith   b->Nmax         = B->n;
17364e220ebcSLois Curfman McInnes 
1737a23d5eceSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C",
1738a23d5eceSKris Buschelman                                     "MatSeqDenseSetPreallocation_SeqDense",
1739a23d5eceSKris Buschelman                                      MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
17403a40ed3dSBarry Smith   PetscFunctionReturn(0);
1741289bc588SBarry Smith }
1742273d9f13SBarry Smith EXTERN_C_END
1743