xref: /petsc/src/mat/impls/dense/seq/dense.c (revision b1d4fb267e72f6b087ed013bbfbbee1418c3f503)
173f4d377SMatthew Knepley /*$Id: dense.c,v 1.208 2001/09/07 20:09:16 bsmith Exp $*/
267e560aaSBarry Smith /*
367e560aaSBarry Smith      Defines the basic matrix operations for sequential dense.
467e560aaSBarry Smith */
5289bc588SBarry Smith 
670f55243SBarry Smith #include "src/mat/impls/dense/seq/dense.h"
7b4c862e0SSatish Balay #include "petscblaslapack.h"
8289bc588SBarry Smith 
94a2ae208SSatish Balay #undef __FUNCT__
104a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense"
11268466fbSBarry Smith int MatAXPY_SeqDense(const PetscScalar *alpha,Mat X,Mat Y,MatStructure str)
121987afe7SBarry Smith {
131987afe7SBarry Smith   Mat_SeqDense *x = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
14a5ce6ee0Svictorle   int          N = X->m*X->n,m=X->m,ldax=x->lda,lday=y->lda, j,one = 1;
153a40ed3dSBarry Smith 
163a40ed3dSBarry Smith   PetscFunctionBegin;
17a5ce6ee0Svictorle   if (X->m != Y->m || X->n != Y->n) SETERRQ(PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
18a5ce6ee0Svictorle   if (ldax>m || lday>m) {
19a5ce6ee0Svictorle     for (j=0; j<X->n; j++) {
20268466fbSBarry Smith       BLaxpy_(&m,(PetscScalar*)alpha,x->v+j*ldax,&one,y->v+j*lday,&one);
21a5ce6ee0Svictorle     }
22a5ce6ee0Svictorle   } else {
23268466fbSBarry Smith     BLaxpy_(&N,(PetscScalar*)alpha,x->v,&one,y->v,&one);
24a5ce6ee0Svictorle   }
25b0a32e0cSBarry Smith   PetscLogFlops(2*N-1);
263a40ed3dSBarry Smith   PetscFunctionReturn(0);
271987afe7SBarry Smith }
281987afe7SBarry Smith 
294a2ae208SSatish Balay #undef __FUNCT__
304a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense"
318f6be9afSLois Curfman McInnes int MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
32289bc588SBarry Smith {
334e220ebcSLois Curfman McInnes   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
34273d9f13SBarry Smith   int          i,N = A->m*A->n,count = 0;
3587828ca2SBarry Smith   PetscScalar  *v = a->v;
363a40ed3dSBarry Smith 
373a40ed3dSBarry Smith   PetscFunctionBegin;
38289bc588SBarry Smith   for (i=0; i<N; i++) {if (*v != 0.0) count++; v++;}
394e220ebcSLois Curfman McInnes 
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;
464e220ebcSLois Curfman McInnes   info->nz_used           = (double)count;
474e220ebcSLois Curfman McInnes   info->nz_unneeded       = (double)(N-count);
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;
544e220ebcSLois Curfman McInnes 
553a40ed3dSBarry Smith   PetscFunctionReturn(0);
56289bc588SBarry Smith }
57289bc588SBarry Smith 
584a2ae208SSatish Balay #undef __FUNCT__
594a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense"
60268466fbSBarry Smith int MatScale_SeqDense(const PetscScalar *alpha,Mat A)
6180cd9d93SLois Curfman McInnes {
62273d9f13SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
63a5ce6ee0Svictorle   int          one = 1,lda = a->lda,j,nz;
6480cd9d93SLois Curfman McInnes 
653a40ed3dSBarry Smith   PetscFunctionBegin;
66a5ce6ee0Svictorle   if (lda>A->m) {
67a5ce6ee0Svictorle     nz = A->m;
68a5ce6ee0Svictorle     for (j=0; j<A->n; j++) {
69268466fbSBarry Smith       BLscal_(&nz,(PetscScalar*)alpha,a->v+j*lda,&one);
70a5ce6ee0Svictorle     }
71a5ce6ee0Svictorle   } else {
72273d9f13SBarry Smith     nz = A->m*A->n;
73268466fbSBarry Smith     BLscal_(&nz,(PetscScalar*)alpha,a->v,&one);
74a5ce6ee0Svictorle   }
75b0a32e0cSBarry Smith   PetscLogFlops(nz);
763a40ed3dSBarry Smith   PetscFunctionReturn(0);
7780cd9d93SLois Curfman McInnes }
7880cd9d93SLois Curfman McInnes 
79289bc588SBarry Smith /* ---------------------------------------------------------------*/
806831982aSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
816831982aSBarry Smith    rather than put it in the Mat->row slot.*/
824a2ae208SSatish Balay #undef __FUNCT__
834a2ae208SSatish Balay #define __FUNCT__ "MatLUFactor_SeqDense"
84b380c88cSHong Zhang int MatLUFactor_SeqDense(Mat A,IS row,IS col,MatFactorInfo *minfo)
85289bc588SBarry Smith {
86c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
87b0a32e0cSBarry Smith   int          info,ierr;
8855659b69SBarry Smith 
893a40ed3dSBarry Smith   PetscFunctionBegin;
90289bc588SBarry Smith   if (!mat->pivots) {
91b0a32e0cSBarry Smith     ierr = PetscMalloc((A->m+1)*sizeof(int),&mat->pivots);CHKERRQ(ierr);
92b0a32e0cSBarry Smith     PetscLogObjectMemory(A,A->m*sizeof(int));
93289bc588SBarry Smith   }
94f1af5d2fSBarry Smith   A->factor = FACTOR_LU;
95273d9f13SBarry Smith   if (!A->m || !A->n) PetscFunctionReturn(0);
96ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRF)
9780444007SBarry Smith   SETERRQ(PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
98ae7cfcebSSatish Balay #else
991b807ce4Svictorle   LAgetrf_(&A->m,&A->n,mat->v,&mat->lda,mat->pivots,&info);
10029bbc08cSBarry Smith   if (info<0) SETERRQ(PETSC_ERR_LIB,"Bad argument to LU factorization");
10129bbc08cSBarry Smith   if (info>0) SETERRQ(PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
1022ffef20aSBarry Smith #endif
103b0a32e0cSBarry Smith   PetscLogFlops((2*A->n*A->n*A->n)/3);
1043a40ed3dSBarry Smith   PetscFunctionReturn(0);
105289bc588SBarry Smith }
1066ee01492SSatish Balay 
1074a2ae208SSatish Balay #undef __FUNCT__
1084a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense"
1095609ef8eSBarry Smith int MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
11002cad45dSBarry Smith {
11102cad45dSBarry Smith   Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l;
112a5ce6ee0Svictorle   int          lda = mat->lda,j,m,ierr;
11302cad45dSBarry Smith   Mat          newi;
11402cad45dSBarry Smith 
1153a40ed3dSBarry Smith   PetscFunctionBegin;
116273d9f13SBarry Smith   ierr = MatCreateSeqDense(A->comm,A->m,A->n,PETSC_NULL,&newi);CHKERRQ(ierr);
1175609ef8eSBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
118a5ce6ee0Svictorle     l = (Mat_SeqDense*)newi->data;
119a5ce6ee0Svictorle     if (lda>A->m) {
120a5ce6ee0Svictorle       m = A->m;
121a5ce6ee0Svictorle       for (j=0; j<A->n; j++) {
122a5ce6ee0Svictorle 	ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
123a5ce6ee0Svictorle       }
124a5ce6ee0Svictorle     } else {
12587828ca2SBarry Smith       ierr = PetscMemcpy(l->v,mat->v,A->m*A->n*sizeof(PetscScalar));CHKERRQ(ierr);
12602cad45dSBarry Smith     }
127a5ce6ee0Svictorle   }
12802cad45dSBarry Smith   newi->assembled = PETSC_TRUE;
12902cad45dSBarry Smith   *newmat = newi;
1303a40ed3dSBarry Smith   PetscFunctionReturn(0);
13102cad45dSBarry Smith }
13202cad45dSBarry Smith 
1334a2ae208SSatish Balay #undef __FUNCT__
1344a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
135b380c88cSHong Zhang int MatLUFactorSymbolic_SeqDense(Mat A,IS row,IS col,MatFactorInfo *info,Mat *fact)
136289bc588SBarry Smith {
1373a40ed3dSBarry Smith   int ierr;
1383a40ed3dSBarry Smith 
1393a40ed3dSBarry Smith   PetscFunctionBegin;
1405609ef8eSBarry Smith   ierr = MatDuplicate_SeqDense(A,MAT_DO_NOT_COPY_VALUES,fact);CHKERRQ(ierr);
1413a40ed3dSBarry Smith   PetscFunctionReturn(0);
142289bc588SBarry Smith }
1436ee01492SSatish Balay 
1444a2ae208SSatish Balay #undef __FUNCT__
1454a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
1468f6be9afSLois Curfman McInnes int MatLUFactorNumeric_SeqDense(Mat A,Mat *fact)
147289bc588SBarry Smith {
14802cad45dSBarry Smith   Mat_SeqDense *mat = (Mat_SeqDense*)A->data,*l = (Mat_SeqDense*)(*fact)->data;
1491b807ce4Svictorle   int          lda1=mat->lda,lda2=l->lda, m=A->m,n=A->n, j,ierr;
1503a40ed3dSBarry Smith 
1513a40ed3dSBarry Smith   PetscFunctionBegin;
15202cad45dSBarry Smith   /* copy the numerical values */
1531b807ce4Svictorle   if (lda1>m || lda2>m ) {
1541b807ce4Svictorle     for (j=0; j<n; j++) {
1551b807ce4Svictorle       ierr = PetscMemcpy(l->v+j*lda2,mat->v+j*lda1,m*sizeof(PetscScalar)); CHKERRQ(ierr);
1561b807ce4Svictorle     }
1571b807ce4Svictorle   } else {
15887828ca2SBarry Smith     ierr = PetscMemcpy(l->v,mat->v,A->m*A->n*sizeof(PetscScalar));CHKERRQ(ierr);
1591b807ce4Svictorle   }
16002cad45dSBarry Smith   (*fact)->factor = 0;
161e03a110bSBarry Smith   ierr = MatLUFactor(*fact,0,0,PETSC_NULL);CHKERRQ(ierr);
1623a40ed3dSBarry Smith   PetscFunctionReturn(0);
163289bc588SBarry Smith }
1646ee01492SSatish Balay 
1654a2ae208SSatish Balay #undef __FUNCT__
1664a2ae208SSatish Balay #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
16715e8a5b3SHong Zhang int MatCholeskyFactorSymbolic_SeqDense(Mat A,IS row,MatFactorInfo *info,Mat *fact)
168289bc588SBarry Smith {
1693a40ed3dSBarry Smith   int ierr;
1703a40ed3dSBarry Smith 
1713a40ed3dSBarry Smith   PetscFunctionBegin;
1723a40ed3dSBarry Smith   ierr = MatConvert(A,MATSAME,fact);CHKERRQ(ierr);
1733a40ed3dSBarry Smith   PetscFunctionReturn(0);
174289bc588SBarry Smith }
1756ee01492SSatish Balay 
1764a2ae208SSatish Balay #undef __FUNCT__
1774a2ae208SSatish Balay #define __FUNCT__ "MatCholeskyFactor_SeqDense"
17815e8a5b3SHong Zhang int MatCholeskyFactor_SeqDense(Mat A,IS perm,MatFactorInfo *factinfo)
179289bc588SBarry Smith {
180c0bbcb79SLois Curfman McInnes   Mat_SeqDense  *mat = (Mat_SeqDense*)A->data;
181606d414cSSatish Balay   int           info,ierr;
18255659b69SBarry Smith 
1833a40ed3dSBarry Smith   PetscFunctionBegin;
184752f5567SLois Curfman McInnes   if (mat->pivots) {
185606d414cSSatish Balay     ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
186b0a32e0cSBarry Smith     PetscLogObjectMemory(A,-A->m*sizeof(int));
187752f5567SLois Curfman McInnes     mat->pivots = 0;
188752f5567SLois Curfman McInnes   }
189273d9f13SBarry Smith   if (!A->m || !A->n) PetscFunctionReturn(0);
190ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRF)
19180444007SBarry Smith   SETERRQ(PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
192ae7cfcebSSatish Balay #else
1931b807ce4Svictorle   LApotrf_("L",&A->n,mat->v,&mat->lda,&info);
19429bbc08cSBarry Smith   if (info) SETERRQ1(PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %d",info-1);
1952ffef20aSBarry Smith #endif
196c0bbcb79SLois Curfman McInnes   A->factor = FACTOR_CHOLESKY;
197b0a32e0cSBarry Smith   PetscLogFlops((A->n*A->n*A->n)/3);
1983a40ed3dSBarry Smith   PetscFunctionReturn(0);
199289bc588SBarry Smith }
200289bc588SBarry Smith 
2014a2ae208SSatish Balay #undef __FUNCT__
2020b4b3355SBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
2030b4b3355SBarry Smith int MatCholeskyFactorNumeric_SeqDense(Mat A,Mat *fact)
2040b4b3355SBarry Smith {
2050b4b3355SBarry Smith   int ierr;
20615e8a5b3SHong Zhang   MatFactorInfo info;
2070b4b3355SBarry Smith 
2080b4b3355SBarry Smith   PetscFunctionBegin;
20915e8a5b3SHong Zhang   info.fill = 1.0;
21015e8a5b3SHong Zhang   ierr = MatCholeskyFactor_SeqDense(*fact,0,&info);CHKERRQ(ierr);
2110b4b3355SBarry Smith   PetscFunctionReturn(0);
2120b4b3355SBarry Smith }
2130b4b3355SBarry Smith 
2140b4b3355SBarry Smith #undef __FUNCT__
2154a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense"
2168f6be9afSLois Curfman McInnes int MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
217289bc588SBarry Smith {
218c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
219a57ad546SLois Curfman McInnes   int          one = 1,info,ierr;
22087828ca2SBarry Smith   PetscScalar  *x,*y;
22167e560aaSBarry Smith 
2223a40ed3dSBarry Smith   PetscFunctionBegin;
223273d9f13SBarry Smith   if (!A->m || !A->n) PetscFunctionReturn(0);
224*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(xx,&x);CHKERRQ(ierr);
225*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(yy,&y);CHKERRQ(ierr);
22687828ca2SBarry Smith   ierr = PetscMemcpy(y,x,A->m*sizeof(PetscScalar));CHKERRQ(ierr);
227c0bbcb79SLois Curfman McInnes   if (A->factor == FACTOR_LU) {
228ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
22980444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
230ae7cfcebSSatish Balay #else
2311b807ce4Svictorle     LAgetrs_("N",&A->m,&one,mat->v,&mat->lda,mat->pivots,y,&A->m,&info);
2322ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"MBad solve");
233ae7cfcebSSatish Balay #endif
2347a97a34bSBarry Smith   } else if (A->factor == FACTOR_CHOLESKY){
235ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
23680444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
237ae7cfcebSSatish Balay #else
2381b807ce4Svictorle     LApotrs_("L",&A->m,&one,mat->v,&mat->lda,y,&A->m,&info);
2392ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"MBad solve");
240ae7cfcebSSatish Balay #endif
241289bc588SBarry Smith   }
24229bbc08cSBarry Smith   else SETERRQ(PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
243*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(xx,&x);CHKERRQ(ierr);
244*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(yy,&y);CHKERRQ(ierr);
245b0a32e0cSBarry Smith   PetscLogFlops(2*A->n*A->n - A->n);
2463a40ed3dSBarry Smith   PetscFunctionReturn(0);
247289bc588SBarry Smith }
2486ee01492SSatish Balay 
2494a2ae208SSatish Balay #undef __FUNCT__
2504a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
2517c922b88SBarry Smith int MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
252da3a660dSBarry Smith {
253c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
2547a97a34bSBarry Smith   int          ierr,one = 1,info;
25587828ca2SBarry Smith   PetscScalar  *x,*y;
25667e560aaSBarry Smith 
2573a40ed3dSBarry Smith   PetscFunctionBegin;
258273d9f13SBarry Smith   if (!A->m || !A->n) PetscFunctionReturn(0);
259*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(xx,&x);CHKERRQ(ierr);
260*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(yy,&y);CHKERRQ(ierr);
26187828ca2SBarry Smith   ierr = PetscMemcpy(y,x,A->m*sizeof(PetscScalar));CHKERRQ(ierr);
262752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
263da3a660dSBarry Smith   if (mat->pivots) {
264ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
26580444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
266ae7cfcebSSatish Balay #else
2671b807ce4Svictorle     LAgetrs_("T",&A->m,&one,mat->v,&mat->lda,mat->pivots,y,&A->m,&info);
2682ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve");
269ae7cfcebSSatish Balay #endif
2707a97a34bSBarry Smith   } else {
271ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
27280444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
273ae7cfcebSSatish Balay #else
2741b807ce4Svictorle     LApotrs_("L",&A->m,&one,mat->v,&mat->lda,y,&A->m,&info);
2752ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve");
276ae7cfcebSSatish Balay #endif
277da3a660dSBarry Smith   }
278*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(xx,&x);CHKERRQ(ierr);
279*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(yy,&y);CHKERRQ(ierr);
280b0a32e0cSBarry Smith   PetscLogFlops(2*A->n*A->n - A->n);
2813a40ed3dSBarry Smith   PetscFunctionReturn(0);
282da3a660dSBarry Smith }
2836ee01492SSatish Balay 
2844a2ae208SSatish Balay #undef __FUNCT__
2854a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
2868f6be9afSLois Curfman McInnes int MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
287da3a660dSBarry Smith {
288c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
2897a97a34bSBarry Smith   int          ierr,one = 1,info;
29087828ca2SBarry Smith   PetscScalar  *x,*y,sone = 1.0;
291da3a660dSBarry Smith   Vec          tmp = 0;
29267e560aaSBarry Smith 
2933a40ed3dSBarry Smith   PetscFunctionBegin;
294*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(xx,&x);CHKERRQ(ierr);
295*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(yy,&y);CHKERRQ(ierr);
296273d9f13SBarry Smith   if (!A->m || !A->n) PetscFunctionReturn(0);
297da3a660dSBarry Smith   if (yy == zz) {
29878b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
299b0a32e0cSBarry Smith     PetscLogObjectParent(A,tmp);
30078b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
301da3a660dSBarry Smith   }
30287828ca2SBarry Smith   ierr = PetscMemcpy(y,x,A->m*sizeof(PetscScalar));CHKERRQ(ierr);
303752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
304da3a660dSBarry Smith   if (mat->pivots) {
305ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
30680444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
307ae7cfcebSSatish Balay #else
3081b807ce4Svictorle     LAgetrs_("N",&A->m,&one,mat->v,&mat->lda,mat->pivots,y,&A->m,&info);
3092ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve");
310ae7cfcebSSatish Balay #endif
311a8c6a408SBarry Smith   } else {
312ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
31380444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
314ae7cfcebSSatish Balay #else
3151b807ce4Svictorle     LApotrs_("L",&A->m,&one,mat->v,&mat->lda,y,&A->m,&info);
3162ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve");
317ae7cfcebSSatish Balay #endif
318da3a660dSBarry Smith   }
319a8c6a408SBarry Smith   if (tmp) {ierr = VecAXPY(&sone,tmp,yy);CHKERRQ(ierr); ierr = VecDestroy(tmp);CHKERRQ(ierr);}
320a8c6a408SBarry Smith   else     {ierr = VecAXPY(&sone,zz,yy);CHKERRQ(ierr);}
321*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(xx,&x);CHKERRQ(ierr);
322*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(yy,&y);CHKERRQ(ierr);
323b0a32e0cSBarry Smith   PetscLogFlops(2*A->n*A->n);
3243a40ed3dSBarry Smith   PetscFunctionReturn(0);
325da3a660dSBarry Smith }
32667e560aaSBarry Smith 
3274a2ae208SSatish Balay #undef __FUNCT__
3284a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
3297c922b88SBarry Smith int MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
330da3a660dSBarry Smith {
331c0bbcb79SLois Curfman McInnes   Mat_SeqDense  *mat = (Mat_SeqDense*)A->data;
3326abc6512SBarry Smith   int           one = 1,info,ierr;
33387828ca2SBarry Smith   PetscScalar   *x,*y,sone = 1.0;
334da3a660dSBarry Smith   Vec           tmp;
33567e560aaSBarry Smith 
3363a40ed3dSBarry Smith   PetscFunctionBegin;
337273d9f13SBarry Smith   if (!A->m || !A->n) PetscFunctionReturn(0);
338*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(xx,&x);CHKERRQ(ierr);
339*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(yy,&y);CHKERRQ(ierr);
340da3a660dSBarry Smith   if (yy == zz) {
34178b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
342b0a32e0cSBarry Smith     PetscLogObjectParent(A,tmp);
34378b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
344da3a660dSBarry Smith   }
34587828ca2SBarry Smith   ierr = PetscMemcpy(y,x,A->m*sizeof(PetscScalar));CHKERRQ(ierr);
346752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
347da3a660dSBarry Smith   if (mat->pivots) {
348ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
34980444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
350ae7cfcebSSatish Balay #else
3511b807ce4Svictorle     LAgetrs_("T",&A->m,&one,mat->v,&mat->lda,mat->pivots,y,&A->m,&info);
3522ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve");
353ae7cfcebSSatish Balay #endif
3543a40ed3dSBarry Smith   } else {
355ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
35680444007SBarry Smith     SETERRQ(PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
357ae7cfcebSSatish Balay #else
3581b807ce4Svictorle     LApotrs_("L",&A->m,&one,mat->v,&mat->lda,y,&A->m,&info);
3592ffef20aSBarry Smith     if (info) SETERRQ(PETSC_ERR_LIB,"Bad solve");
360ae7cfcebSSatish Balay #endif
361da3a660dSBarry Smith   }
36290f02eecSBarry Smith   if (tmp) {
36390f02eecSBarry Smith     ierr = VecAXPY(&sone,tmp,yy);CHKERRQ(ierr);
36490f02eecSBarry Smith     ierr = VecDestroy(tmp);CHKERRQ(ierr);
3653a40ed3dSBarry Smith   } else {
36690f02eecSBarry Smith     ierr = VecAXPY(&sone,zz,yy);CHKERRQ(ierr);
36790f02eecSBarry Smith   }
368*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(xx,&x);CHKERRQ(ierr);
369*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(yy,&y);CHKERRQ(ierr);
370b0a32e0cSBarry Smith   PetscLogFlops(2*A->n*A->n);
3713a40ed3dSBarry Smith   PetscFunctionReturn(0);
372da3a660dSBarry Smith }
373289bc588SBarry Smith /* ------------------------------------------------------------------*/
3744a2ae208SSatish Balay #undef __FUNCT__
3754a2ae208SSatish Balay #define __FUNCT__ "MatRelax_SeqDense"
376329f5518SBarry Smith int MatRelax_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,
377c14dc6b6SHong Zhang                           PetscReal shift,int its,int lits,Vec xx)
378289bc588SBarry Smith {
379c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
38087828ca2SBarry Smith   PetscScalar  *x,*b,*v = mat->v,zero = 0.0,xt;
381273d9f13SBarry Smith   int          ierr,m = A->m,i;
382aa482453SBarry Smith #if !defined(PETSC_USE_COMPLEX)
383bc1b551cSSatish Balay   int          o = 1;
384bc1b551cSSatish Balay #endif
385289bc588SBarry Smith 
3863a40ed3dSBarry Smith   PetscFunctionBegin;
387289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
3883a40ed3dSBarry Smith     /* this is a hack fix, should have another version without the second BLdot */
389bbb6d6a8SBarry Smith     ierr = VecSet(&zero,xx);CHKERRQ(ierr);
390289bc588SBarry Smith   }
391*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(xx,&x);CHKERRQ(ierr);
392*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(bb,&b);CHKERRQ(ierr);
393b965ef7fSBarry Smith   its  = its*lits;
39491723122SBarry Smith   if (its <= 0) SETERRQ2(PETSC_ERR_ARG_WRONG,"Relaxation requires global its %d and local its %d both positive",its,lits);
395289bc588SBarry Smith   while (its--) {
396289bc588SBarry Smith     if (flag & SOR_FORWARD_SWEEP){
397289bc588SBarry Smith       for (i=0; i<m; i++) {
398aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
399f1747703SBarry Smith         /* cannot use BLAS dot for complex because compiler/linker is
400f1747703SBarry Smith            not happy about returning a double complex */
401f1747703SBarry Smith         int         _i;
40287828ca2SBarry Smith         PetscScalar sum = b[i];
403f1747703SBarry Smith         for (_i=0; _i<m; _i++) {
4043f6de6efSSatish Balay           sum -= PetscConj(v[i+_i*m])*x[_i];
405f1747703SBarry Smith         }
406f1747703SBarry Smith         xt = sum;
407f1747703SBarry Smith #else
408289bc588SBarry Smith         xt = b[i]-BLdot_(&m,v+i,&m,x,&o);
409f1747703SBarry Smith #endif
41055a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
411289bc588SBarry Smith       }
412289bc588SBarry Smith     }
413289bc588SBarry Smith     if (flag & SOR_BACKWARD_SWEEP) {
414289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
415aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
416f1747703SBarry Smith         /* cannot use BLAS dot for complex because compiler/linker is
417f1747703SBarry Smith            not happy about returning a double complex */
418f1747703SBarry Smith         int         _i;
41987828ca2SBarry Smith         PetscScalar sum = b[i];
420f1747703SBarry Smith         for (_i=0; _i<m; _i++) {
4213f6de6efSSatish Balay           sum -= PetscConj(v[i+_i*m])*x[_i];
422f1747703SBarry Smith         }
423f1747703SBarry Smith         xt = sum;
424f1747703SBarry Smith #else
425289bc588SBarry Smith         xt = b[i]-BLdot_(&m,v+i,&m,x,&o);
426f1747703SBarry Smith #endif
42755a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
428289bc588SBarry Smith       }
429289bc588SBarry Smith     }
430289bc588SBarry Smith   }
431*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(bb,&b);CHKERRQ(ierr);
432*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(xx,&x);CHKERRQ(ierr);
4333a40ed3dSBarry Smith   PetscFunctionReturn(0);
434289bc588SBarry Smith }
435289bc588SBarry Smith 
436289bc588SBarry Smith /* -----------------------------------------------------------------*/
4374a2ae208SSatish Balay #undef __FUNCT__
4384a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
4397c922b88SBarry Smith int MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
440289bc588SBarry Smith {
441c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
44287828ca2SBarry Smith   PetscScalar  *v = mat->v,*x,*y;
443ea709b57SSatish Balay   int          ierr,_One=1;
444ea709b57SSatish Balay   PetscScalar  _DOne=1.0,_DZero=0.0;
4453a40ed3dSBarry Smith 
4463a40ed3dSBarry Smith   PetscFunctionBegin;
447273d9f13SBarry Smith   if (!A->m || !A->n) PetscFunctionReturn(0);
448*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(xx,&x);CHKERRQ(ierr);
449*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(yy,&y);CHKERRQ(ierr);
4501b807ce4Svictorle   LAgemv_("T",&(A->m),&(A->n),&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One);
451*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(xx,&x);CHKERRQ(ierr);
452*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(yy,&y);CHKERRQ(ierr);
453b0a32e0cSBarry Smith   PetscLogFlops(2*A->m*A->n - A->n);
4543a40ed3dSBarry Smith   PetscFunctionReturn(0);
455289bc588SBarry Smith }
4566ee01492SSatish Balay 
4574a2ae208SSatish Balay #undef __FUNCT__
4584a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
45944cd7ae7SLois Curfman McInnes int MatMult_SeqDense(Mat A,Vec xx,Vec yy)
460289bc588SBarry Smith {
461c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
46287828ca2SBarry Smith   PetscScalar  *v = mat->v,*x,*y,_DOne=1.0,_DZero=0.0;
463329f5518SBarry Smith   int          ierr,_One=1;
4643a40ed3dSBarry Smith 
4653a40ed3dSBarry Smith   PetscFunctionBegin;
466273d9f13SBarry Smith   if (!A->m || !A->n) PetscFunctionReturn(0);
467*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(xx,&x);CHKERRQ(ierr);
468*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(yy,&y);CHKERRQ(ierr);
4691b807ce4Svictorle   LAgemv_("N",&(A->m),&(A->n),&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One);
470*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(xx,&x);CHKERRQ(ierr);
471*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(yy,&y);CHKERRQ(ierr);
472b0a32e0cSBarry Smith   PetscLogFlops(2*A->m*A->n - A->m);
4733a40ed3dSBarry Smith   PetscFunctionReturn(0);
474289bc588SBarry Smith }
4756ee01492SSatish Balay 
4764a2ae208SSatish Balay #undef __FUNCT__
4774a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
47844cd7ae7SLois Curfman McInnes int MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
479289bc588SBarry Smith {
480c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
48187828ca2SBarry Smith   PetscScalar  *v = mat->v,*x,*y,_DOne=1.0;
482329f5518SBarry Smith   int          ierr,_One=1;
4833a40ed3dSBarry Smith 
4843a40ed3dSBarry Smith   PetscFunctionBegin;
485273d9f13SBarry Smith   if (!A->m || !A->n) PetscFunctionReturn(0);
486600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
487*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(xx,&x);CHKERRQ(ierr);
488*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(yy,&y);CHKERRQ(ierr);
4891b807ce4Svictorle   LAgemv_("N",&(A->m),&(A->n),&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
490*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(xx,&x);CHKERRQ(ierr);
491*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(yy,&y);CHKERRQ(ierr);
492b0a32e0cSBarry Smith   PetscLogFlops(2*A->m*A->n);
4933a40ed3dSBarry Smith   PetscFunctionReturn(0);
494289bc588SBarry Smith }
4956ee01492SSatish Balay 
4964a2ae208SSatish Balay #undef __FUNCT__
4974a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
4987c922b88SBarry Smith int MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
499289bc588SBarry Smith {
500c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
50187828ca2SBarry Smith   PetscScalar  *v = mat->v,*x,*y;
5027a97a34bSBarry Smith   int          ierr,_One=1;
50387828ca2SBarry Smith   PetscScalar  _DOne=1.0;
5043a40ed3dSBarry Smith 
5053a40ed3dSBarry Smith   PetscFunctionBegin;
506273d9f13SBarry Smith   if (!A->m || !A->n) PetscFunctionReturn(0);
507600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
508*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(xx,&x);CHKERRQ(ierr);
509*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(yy,&y);CHKERRQ(ierr);
5101b807ce4Svictorle   LAgemv_("T",&(A->m),&(A->n),&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One);
511*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(xx,&x);CHKERRQ(ierr);
512*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(yy,&y);CHKERRQ(ierr);
513b0a32e0cSBarry Smith   PetscLogFlops(2*A->m*A->n);
5143a40ed3dSBarry Smith   PetscFunctionReturn(0);
515289bc588SBarry Smith }
516289bc588SBarry Smith 
517289bc588SBarry Smith /* -----------------------------------------------------------------*/
5184a2ae208SSatish Balay #undef __FUNCT__
5194a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
52087828ca2SBarry Smith int MatGetRow_SeqDense(Mat A,int row,int *ncols,int **cols,PetscScalar **vals)
521289bc588SBarry Smith {
522c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
52387828ca2SBarry Smith   PetscScalar  *v;
524b0a32e0cSBarry Smith   int          i,ierr;
52567e560aaSBarry Smith 
5263a40ed3dSBarry Smith   PetscFunctionBegin;
527273d9f13SBarry Smith   *ncols = A->n;
528289bc588SBarry Smith   if (cols) {
529b0a32e0cSBarry Smith     ierr = PetscMalloc((A->n+1)*sizeof(int),cols);CHKERRQ(ierr);
530273d9f13SBarry Smith     for (i=0; i<A->n; i++) (*cols)[i] = i;
531289bc588SBarry Smith   }
532289bc588SBarry Smith   if (vals) {
53387828ca2SBarry Smith     ierr = PetscMalloc((A->n+1)*sizeof(PetscScalar),vals);CHKERRQ(ierr);
534289bc588SBarry Smith     v    = mat->v + row;
5351b807ce4Svictorle     for (i=0; i<A->n; i++) {(*vals)[i] = *v; v += mat->lda;}
536289bc588SBarry Smith   }
5373a40ed3dSBarry Smith   PetscFunctionReturn(0);
538289bc588SBarry Smith }
5396ee01492SSatish Balay 
5404a2ae208SSatish Balay #undef __FUNCT__
5414a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
54287828ca2SBarry Smith int MatRestoreRow_SeqDense(Mat A,int row,int *ncols,int **cols,PetscScalar **vals)
543289bc588SBarry Smith {
544606d414cSSatish Balay   int ierr;
545606d414cSSatish Balay   PetscFunctionBegin;
546606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
547606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
5483a40ed3dSBarry Smith   PetscFunctionReturn(0);
549289bc588SBarry Smith }
550289bc588SBarry Smith /* ----------------------------------------------------------------*/
5514a2ae208SSatish Balay #undef __FUNCT__
5524a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
553f15d580aSBarry Smith int MatSetValues_SeqDense(Mat A,int m,const int indexm[],int n,const int indexn[],const PetscScalar v[],InsertMode addv)
554289bc588SBarry Smith {
555c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
556cddbea37SSatish Balay   int          i,j,idx=0;
557d6dfbf8fSBarry Smith 
5583a40ed3dSBarry Smith   PetscFunctionBegin;
559289bc588SBarry Smith   if (!mat->roworiented) {
560dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
561289bc588SBarry Smith       for (j=0; j<n; j++) {
562cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
563aa482453SBarry Smith #if defined(PETSC_USE_BOPT_g)
564590ac198SBarry Smith         if (indexn[j] >= A->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %d max %d",indexn[j],A->n-1);
56558804f6dSBarry Smith #endif
566289bc588SBarry Smith         for (i=0; i<m; i++) {
567cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
568aa482453SBarry Smith #if defined(PETSC_USE_BOPT_g)
5695c8e7597SSatish Balay           if (indexm[i] >= A->m) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %d max %d",indexm[i],A->m-1);
57058804f6dSBarry Smith #endif
571cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
572289bc588SBarry Smith         }
573289bc588SBarry Smith       }
5743a40ed3dSBarry Smith     } else {
575289bc588SBarry Smith       for (j=0; j<n; j++) {
576cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
577aa482453SBarry Smith #if defined(PETSC_USE_BOPT_g)
578590ac198SBarry Smith         if (indexn[j] >= A->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %d max %d",indexn[j],A->n-1);
57958804f6dSBarry Smith #endif
580289bc588SBarry Smith         for (i=0; i<m; i++) {
581cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
582aa482453SBarry Smith #if defined(PETSC_USE_BOPT_g)
5835c8e7597SSatish Balay           if (indexm[i] >= A->m) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %d max %d",indexm[i],A->m-1);
58458804f6dSBarry Smith #endif
585cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
586289bc588SBarry Smith         }
587289bc588SBarry Smith       }
588289bc588SBarry Smith     }
5893a40ed3dSBarry Smith   } else {
590dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
591e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
592cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
593aa482453SBarry Smith #if defined(PETSC_USE_BOPT_g)
5945c8e7597SSatish Balay         if (indexm[i] >= A->m) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %d max %d",indexm[j],A->m-1);
59558804f6dSBarry Smith #endif
596e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
597cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
598aa482453SBarry Smith #if defined(PETSC_USE_BOPT_g)
5995c8e7597SSatish Balay           if (indexn[j] >= A->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %d max %d",indexn[i],A->n-1);
60058804f6dSBarry Smith #endif
601cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
602e8d4e0b9SBarry Smith         }
603e8d4e0b9SBarry Smith       }
6043a40ed3dSBarry Smith     } else {
605289bc588SBarry Smith       for (i=0; i<m; i++) {
606cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
607aa482453SBarry Smith #if defined(PETSC_USE_BOPT_g)
6085c8e7597SSatish Balay         if (indexm[i] >= A->m) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %d max %d",indexm[j],A->m-1);
60958804f6dSBarry Smith #endif
610289bc588SBarry Smith         for (j=0; j<n; j++) {
611cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
612aa482453SBarry Smith #if defined(PETSC_USE_BOPT_g)
6135c8e7597SSatish Balay           if (indexn[j] >= A->n) SETERRQ2(PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %d max %d",indexn[i],A->n-1);
61458804f6dSBarry Smith #endif
615cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
616289bc588SBarry Smith         }
617289bc588SBarry Smith       }
618289bc588SBarry Smith     }
619e8d4e0b9SBarry Smith   }
6203a40ed3dSBarry Smith   PetscFunctionReturn(0);
621289bc588SBarry Smith }
622e8d4e0b9SBarry Smith 
6234a2ae208SSatish Balay #undef __FUNCT__
6244a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
625f15d580aSBarry Smith int MatGetValues_SeqDense(Mat A,int m,const int indexm[],int n,const int indexn[],PetscScalar v[])
626ae80bb75SLois Curfman McInnes {
627ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
628ae80bb75SLois Curfman McInnes   int          i,j;
62987828ca2SBarry Smith   PetscScalar  *vpt = v;
630ae80bb75SLois Curfman McInnes 
6313a40ed3dSBarry Smith   PetscFunctionBegin;
632ae80bb75SLois Curfman McInnes   /* row-oriented output */
633ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
634ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
6351b807ce4Svictorle       *vpt++ = mat->v[indexn[j]*mat->lda + indexm[i]];
636ae80bb75SLois Curfman McInnes     }
637ae80bb75SLois Curfman McInnes   }
6383a40ed3dSBarry Smith   PetscFunctionReturn(0);
639ae80bb75SLois Curfman McInnes }
640ae80bb75SLois Curfman McInnes 
641289bc588SBarry Smith /* -----------------------------------------------------------------*/
642289bc588SBarry Smith 
643e090d566SSatish Balay #include "petscsys.h"
64488e32edaSLois Curfman McInnes 
6454a2ae208SSatish Balay #undef __FUNCT__
6464a2ae208SSatish Balay #define __FUNCT__ "MatLoad_SeqDense"
6478e9aea5cSBarry Smith int MatLoad_SeqDense(PetscViewer viewer,const MatType type,Mat *A)
64888e32edaSLois Curfman McInnes {
64988e32edaSLois Curfman McInnes   Mat_SeqDense *a;
65088e32edaSLois Curfman McInnes   Mat          B;
65188e32edaSLois Curfman McInnes   int          *scols,i,j,nz,ierr,fd,header[4],size;
65288e32edaSLois Curfman McInnes   int          *rowlengths = 0,M,N,*cols;
65387828ca2SBarry Smith   PetscScalar  *vals,*svals,*v,*w;
65419bcc07fSBarry Smith   MPI_Comm     comm = ((PetscObject)viewer)->comm;
65588e32edaSLois Curfman McInnes 
6563a40ed3dSBarry Smith   PetscFunctionBegin;
657d132466eSBarry Smith   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
65829bbc08cSBarry Smith   if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"view must have one processor");
659b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
6600752156aSBarry Smith   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
661552e946dSBarry Smith   if (header[0] != MAT_FILE_COOKIE) SETERRQ(PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
66288e32edaSLois Curfman McInnes   M = header[1]; N = header[2]; nz = header[3];
66388e32edaSLois Curfman McInnes 
66490ace30eSBarry Smith   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
66590ace30eSBarry Smith     ierr = MatCreateSeqDense(comm,M,N,PETSC_NULL,A);CHKERRQ(ierr);
66690ace30eSBarry Smith     B    = *A;
66790ace30eSBarry Smith     a    = (Mat_SeqDense*)B->data;
6684a41a4d3SSatish Balay     v    = a->v;
6694a41a4d3SSatish Balay     /* Allocate some temp space to read in the values and then flip them
6704a41a4d3SSatish Balay        from row major to column major */
671b72907f3SBarry Smith     ierr = PetscMalloc((M*N > 0 ? M*N : 1)*sizeof(PetscScalar),&w);CHKERRQ(ierr);
67290ace30eSBarry Smith     /* read in nonzero values */
6734a41a4d3SSatish Balay     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
6744a41a4d3SSatish Balay     /* now flip the values and store them in the matrix*/
6754a41a4d3SSatish Balay     for (j=0; j<N; j++) {
6764a41a4d3SSatish Balay       for (i=0; i<M; i++) {
6774a41a4d3SSatish Balay         *v++ =w[i*N+j];
6784a41a4d3SSatish Balay       }
6794a41a4d3SSatish Balay     }
680606d414cSSatish Balay     ierr = PetscFree(w);CHKERRQ(ierr);
6816d4a8577SBarry Smith     ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
6826d4a8577SBarry Smith     ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
68390ace30eSBarry Smith   } else {
68488e32edaSLois Curfman McInnes     /* read row lengths */
685b0a32e0cSBarry Smith     ierr = PetscMalloc((M+1)*sizeof(int),&rowlengths);CHKERRQ(ierr);
6860752156aSBarry Smith     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
68788e32edaSLois Curfman McInnes 
68888e32edaSLois Curfman McInnes     /* create our matrix */
689b4fd4287SBarry Smith     ierr = MatCreateSeqDense(comm,M,N,PETSC_NULL,A);CHKERRQ(ierr);
69088e32edaSLois Curfman McInnes     B = *A;
69188e32edaSLois Curfman McInnes     a = (Mat_SeqDense*)B->data;
69288e32edaSLois Curfman McInnes     v = a->v;
69388e32edaSLois Curfman McInnes 
69488e32edaSLois Curfman McInnes     /* read column indices and nonzeros */
695b0a32e0cSBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(int),&scols);CHKERRQ(ierr);
696b0a32e0cSBarry Smith     cols = scols;
6970752156aSBarry Smith     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
69887828ca2SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&svals);CHKERRQ(ierr);
699b0a32e0cSBarry Smith     vals = svals;
7000752156aSBarry Smith     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
70188e32edaSLois Curfman McInnes 
70288e32edaSLois Curfman McInnes     /* insert into matrix */
70388e32edaSLois Curfman McInnes     for (i=0; i<M; i++) {
70488e32edaSLois Curfman McInnes       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
70588e32edaSLois Curfman McInnes       svals += rowlengths[i]; scols += rowlengths[i];
70688e32edaSLois Curfman McInnes     }
707606d414cSSatish Balay     ierr = PetscFree(vals);CHKERRQ(ierr);
708606d414cSSatish Balay     ierr = PetscFree(cols);CHKERRQ(ierr);
709606d414cSSatish Balay     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
71088e32edaSLois Curfman McInnes 
7116d4a8577SBarry Smith     ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
7126d4a8577SBarry Smith     ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
71390ace30eSBarry Smith   }
7143a40ed3dSBarry Smith   PetscFunctionReturn(0);
71588e32edaSLois Curfman McInnes }
71688e32edaSLois Curfman McInnes 
717e090d566SSatish Balay #include "petscsys.h"
718932b0c3eSLois Curfman McInnes 
7194a2ae208SSatish Balay #undef __FUNCT__
7204a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
721b0a32e0cSBarry Smith static int MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
722289bc588SBarry Smith {
723932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
724fb9695e5SSatish Balay   int               ierr,i,j;
725fb9695e5SSatish Balay   char              *name;
72687828ca2SBarry Smith   PetscScalar       *v;
727f3ef73ceSBarry Smith   PetscViewerFormat format;
728932b0c3eSLois Curfman McInnes 
7293a40ed3dSBarry Smith   PetscFunctionBegin;
730435da068SBarry Smith   ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
731b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
732456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
7333a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
734fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
735b0a32e0cSBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr);
736273d9f13SBarry Smith     for (i=0; i<A->m; i++) {
73744cd7ae7SLois Curfman McInnes       v = a->v + i;
738b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %d:",i);CHKERRQ(ierr);
739273d9f13SBarry Smith       for (j=0; j<A->n; j++) {
740aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
741329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
74262b941d6SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%d, %g + %g i) ",j,PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
743329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
74462b941d6SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%d, %g) ",j,PetscRealPart(*v));CHKERRQ(ierr);
7456831982aSBarry Smith         }
74680cd9d93SLois Curfman McInnes #else
7476831982aSBarry Smith         if (*v) {
74862b941d6SBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%d, %g) ",j,*v);CHKERRQ(ierr);
7496831982aSBarry Smith         }
75080cd9d93SLois Curfman McInnes #endif
7511b807ce4Svictorle         v += a->lda;
75280cd9d93SLois Curfman McInnes       }
753b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
75480cd9d93SLois Curfman McInnes     }
755b0a32e0cSBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr);
7563a40ed3dSBarry Smith   } else {
757b0a32e0cSBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_NO);CHKERRQ(ierr);
758aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
759ffac6cdbSBarry Smith     PetscTruth allreal = PETSC_TRUE;
76047989497SBarry Smith     /* determine if matrix has all real values */
76147989497SBarry Smith     v = a->v;
762201f5f94SSatish Balay     for (i=0; i<A->m*A->n; i++) {
763ffac6cdbSBarry Smith 	if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break ;}
76447989497SBarry Smith     }
76547989497SBarry Smith #endif
766fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
7673a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
768b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %d %d \n",A->m,A->n);CHKERRQ(ierr);
769fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%d,%d);\n",name,A->m,A->n);CHKERRQ(ierr);
770fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
771ffac6cdbSBarry Smith     }
772ffac6cdbSBarry Smith 
773273d9f13SBarry Smith     for (i=0; i<A->m; i++) {
774932b0c3eSLois Curfman McInnes       v = a->v + i;
775273d9f13SBarry Smith       for (j=0; j<A->n; j++) {
776aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
77747989497SBarry Smith         if (allreal) {
7781b807ce4Svictorle           ierr = PetscViewerASCIIPrintf(viewer,"%6.4e ",PetscRealPart(*v));CHKERRQ(ierr);
77947989497SBarry Smith         } else {
7801b807ce4Svictorle           ierr = PetscViewerASCIIPrintf(viewer,"%6.4e + %6.4e i ",PetscRealPart(*v),PetscImaginaryPart(*v));CHKERRQ(ierr);
78147989497SBarry Smith         }
782289bc588SBarry Smith #else
7831b807ce4Svictorle         ierr = PetscViewerASCIIPrintf(viewer,"%6.4e ",*v);CHKERRQ(ierr);
784289bc588SBarry Smith #endif
7851b807ce4Svictorle 	v += a->lda;
786289bc588SBarry Smith       }
787b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
788289bc588SBarry Smith     }
789fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
790b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
791ffac6cdbSBarry Smith     }
792b0a32e0cSBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_YES);CHKERRQ(ierr);
793da3a660dSBarry Smith   }
794b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
7953a40ed3dSBarry Smith   PetscFunctionReturn(0);
796289bc588SBarry Smith }
797289bc588SBarry Smith 
7984a2ae208SSatish Balay #undef __FUNCT__
7994a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
800b0a32e0cSBarry Smith static int MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
801932b0c3eSLois Curfman McInnes {
802932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
803273d9f13SBarry Smith   int               ict,j,n = A->n,m = A->m,i,fd,*col_lens,ierr,nz = m*n;
80487828ca2SBarry Smith   PetscScalar       *v,*anonz,*vals;
805f3ef73ceSBarry Smith   PetscViewerFormat format;
806932b0c3eSLois Curfman McInnes 
8073a40ed3dSBarry Smith   PetscFunctionBegin;
808b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
80990ace30eSBarry Smith 
810b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
811fb9695e5SSatish Balay   if (format == PETSC_VIEWER_BINARY_NATIVE) {
81290ace30eSBarry Smith     /* store the matrix as a dense matrix */
813b0a32e0cSBarry Smith     ierr = PetscMalloc(4*sizeof(int),&col_lens);CHKERRQ(ierr);
814552e946dSBarry Smith     col_lens[0] = MAT_FILE_COOKIE;
81590ace30eSBarry Smith     col_lens[1] = m;
81690ace30eSBarry Smith     col_lens[2] = n;
81790ace30eSBarry Smith     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
8180752156aSBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,1);CHKERRQ(ierr);
819606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
82090ace30eSBarry Smith 
82190ace30eSBarry Smith     /* write out matrix, by rows */
82287828ca2SBarry Smith     ierr = PetscMalloc((m*n+1)*sizeof(PetscScalar),&vals);CHKERRQ(ierr);
82390ace30eSBarry Smith     v    = a->v;
82490ace30eSBarry Smith     for (i=0; i<m; i++) {
82590ace30eSBarry Smith       for (j=0; j<n; j++) {
82690ace30eSBarry Smith         vals[i + j*m] = *v++;
82790ace30eSBarry Smith       }
82890ace30eSBarry Smith     }
8290752156aSBarry Smith     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,0);CHKERRQ(ierr);
830606d414cSSatish Balay     ierr = PetscFree(vals);CHKERRQ(ierr);
83190ace30eSBarry Smith   } else {
832b0a32e0cSBarry Smith     ierr = PetscMalloc((4+nz)*sizeof(int),&col_lens);CHKERRQ(ierr);
833552e946dSBarry Smith     col_lens[0] = MAT_FILE_COOKIE;
834932b0c3eSLois Curfman McInnes     col_lens[1] = m;
835932b0c3eSLois Curfman McInnes     col_lens[2] = n;
836932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
837932b0c3eSLois Curfman McInnes 
838932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
839932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
8400752156aSBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,1);CHKERRQ(ierr);
841932b0c3eSLois Curfman McInnes 
842932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
843932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
844932b0c3eSLois Curfman McInnes     ict = 0;
845932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
846932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
847932b0c3eSLois Curfman McInnes     }
8480752156aSBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,0);CHKERRQ(ierr);
849606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
850932b0c3eSLois Curfman McInnes 
851932b0c3eSLois Curfman McInnes     /* store nonzero values */
85287828ca2SBarry Smith     ierr = PetscMalloc((nz+1)*sizeof(PetscScalar),&anonz);CHKERRQ(ierr);
853932b0c3eSLois Curfman McInnes     ict  = 0;
854932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
855932b0c3eSLois Curfman McInnes       v = a->v + i;
856932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
8571b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
858932b0c3eSLois Curfman McInnes       }
859932b0c3eSLois Curfman McInnes     }
8600752156aSBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,0);CHKERRQ(ierr);
861606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
86290ace30eSBarry Smith   }
8633a40ed3dSBarry Smith   PetscFunctionReturn(0);
864932b0c3eSLois Curfman McInnes }
865932b0c3eSLois Curfman McInnes 
8664a2ae208SSatish Balay #undef __FUNCT__
8674a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
868b0a32e0cSBarry Smith int MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
869f1af5d2fSBarry Smith {
870f1af5d2fSBarry Smith   Mat               A = (Mat) Aa;
871f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
872fb9695e5SSatish Balay   int               m = A->m,n = A->n,color,i,j,ierr;
87387828ca2SBarry Smith   PetscScalar       *v = a->v;
874b0a32e0cSBarry Smith   PetscViewer       viewer;
875b0a32e0cSBarry Smith   PetscDraw         popup;
876329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
877f3ef73ceSBarry Smith   PetscViewerFormat format;
878f1af5d2fSBarry Smith 
879f1af5d2fSBarry Smith   PetscFunctionBegin;
880f1af5d2fSBarry Smith 
881f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
882b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
883b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
884f1af5d2fSBarry Smith 
885f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
886fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
887f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
888b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
889f1af5d2fSBarry Smith     for(j = 0; j < n; j++) {
890f1af5d2fSBarry Smith       x_l = j;
891f1af5d2fSBarry Smith       x_r = x_l + 1.0;
892f1af5d2fSBarry Smith       for(i = 0; i < m; i++) {
893f1af5d2fSBarry Smith         y_l = m - i - 1.0;
894f1af5d2fSBarry Smith         y_r = y_l + 1.0;
895f1af5d2fSBarry Smith #if defined(PETSC_USE_COMPLEX)
896329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
897b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
898329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
899b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
900f1af5d2fSBarry Smith         } else {
901f1af5d2fSBarry Smith           continue;
902f1af5d2fSBarry Smith         }
903f1af5d2fSBarry Smith #else
904f1af5d2fSBarry Smith         if (v[j*m+i] >  0.) {
905b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
906f1af5d2fSBarry Smith         } else if (v[j*m+i] <  0.) {
907b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
908f1af5d2fSBarry Smith         } else {
909f1af5d2fSBarry Smith           continue;
910f1af5d2fSBarry Smith         }
911f1af5d2fSBarry Smith #endif
912b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
913f1af5d2fSBarry Smith       }
914f1af5d2fSBarry Smith     }
915f1af5d2fSBarry Smith   } else {
916f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
917f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
918f1af5d2fSBarry Smith     for(i = 0; i < m*n; i++) {
919f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
920f1af5d2fSBarry Smith     }
921b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
922b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
923b0a32e0cSBarry Smith     if (popup) {ierr  = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
924f1af5d2fSBarry Smith     for(j = 0; j < n; j++) {
925f1af5d2fSBarry Smith       x_l = j;
926f1af5d2fSBarry Smith       x_r = x_l + 1.0;
927f1af5d2fSBarry Smith       for(i = 0; i < m; i++) {
928f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
929f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
930b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
931b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
932f1af5d2fSBarry Smith       }
933f1af5d2fSBarry Smith     }
934f1af5d2fSBarry Smith   }
935f1af5d2fSBarry Smith   PetscFunctionReturn(0);
936f1af5d2fSBarry Smith }
937f1af5d2fSBarry Smith 
9384a2ae208SSatish Balay #undef __FUNCT__
9394a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
940b0a32e0cSBarry Smith int MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
941f1af5d2fSBarry Smith {
942b0a32e0cSBarry Smith   PetscDraw  draw;
943f1af5d2fSBarry Smith   PetscTruth isnull;
944329f5518SBarry Smith   PetscReal  xr,yr,xl,yl,h,w;
945f1af5d2fSBarry Smith   int        ierr;
946f1af5d2fSBarry Smith 
947f1af5d2fSBarry Smith   PetscFunctionBegin;
948b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
949b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
950f1af5d2fSBarry Smith   if (isnull == PETSC_TRUE) PetscFunctionReturn(0);
951f1af5d2fSBarry Smith 
952f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
953273d9f13SBarry Smith   xr  = A->n; yr = A->m; h = yr/10.0; w = xr/10.0;
954f1af5d2fSBarry Smith   xr += w;    yr += h;  xl = -w;     yl = -h;
955b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
956b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
957f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",PETSC_NULL);CHKERRQ(ierr);
958f1af5d2fSBarry Smith   PetscFunctionReturn(0);
959f1af5d2fSBarry Smith }
960f1af5d2fSBarry Smith 
9614a2ae208SSatish Balay #undef __FUNCT__
9624a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
963b0a32e0cSBarry Smith int MatView_SeqDense(Mat A,PetscViewer viewer)
964932b0c3eSLois Curfman McInnes {
965932b0c3eSLois Curfman McInnes   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
966bcd2baecSBarry Smith   int          ierr;
967f1af5d2fSBarry Smith   PetscTruth   issocket,isascii,isbinary,isdraw;
968932b0c3eSLois Curfman McInnes 
9693a40ed3dSBarry Smith   PetscFunctionBegin;
970b0a32e0cSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_SOCKET,&issocket);CHKERRQ(ierr);
971b0a32e0cSBarry Smith   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_ASCII,&isascii);CHKERRQ(ierr);
972fb9695e5SSatish Balay   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_BINARY,&isbinary);CHKERRQ(ierr);
973fb9695e5SSatish Balay   ierr = PetscTypeCompare((PetscObject)viewer,PETSC_VIEWER_DRAW,&isdraw);CHKERRQ(ierr);
9740f5bd95cSBarry Smith 
9750f5bd95cSBarry Smith   if (issocket) {
9761b807ce4Svictorle     if (a->lda>A->m) SETERRQ(1,"Case can not handle LDA");
977b0a32e0cSBarry Smith     ierr = PetscViewerSocketPutScalar(viewer,A->m,A->n,a->v);CHKERRQ(ierr);
9780f5bd95cSBarry Smith   } else if (isascii) {
9793a40ed3dSBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
9800f5bd95cSBarry Smith   } else if (isbinary) {
9813a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
982f1af5d2fSBarry Smith   } else if (isdraw) {
983f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
9845cd90555SBarry Smith   } else {
98529bbc08cSBarry Smith     SETERRQ1(1,"Viewer type %s not supported by dense matrix",((PetscObject)viewer)->type_name);
986932b0c3eSLois Curfman McInnes   }
9873a40ed3dSBarry Smith   PetscFunctionReturn(0);
988932b0c3eSLois Curfman McInnes }
989289bc588SBarry Smith 
9904a2ae208SSatish Balay #undef __FUNCT__
9914a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
992c6e7dd08SBarry Smith int MatDestroy_SeqDense(Mat mat)
993289bc588SBarry Smith {
994ec8511deSBarry Smith   Mat_SeqDense *l = (Mat_SeqDense*)mat->data;
99590f02eecSBarry Smith   int          ierr;
99690f02eecSBarry Smith 
9973a40ed3dSBarry Smith   PetscFunctionBegin;
998aa482453SBarry Smith #if defined(PETSC_USE_LOG)
999b0a32e0cSBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %d Cols %d",mat->m,mat->n);
1000a5a9c739SBarry Smith #endif
1001606d414cSSatish Balay   if (l->pivots) {ierr = PetscFree(l->pivots);CHKERRQ(ierr);}
1002606d414cSSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1003606d414cSSatish Balay   ierr = PetscFree(l);CHKERRQ(ierr);
10043a40ed3dSBarry Smith   PetscFunctionReturn(0);
1005289bc588SBarry Smith }
1006289bc588SBarry Smith 
10074a2ae208SSatish Balay #undef __FUNCT__
10084a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
10098f6be9afSLois Curfman McInnes int MatTranspose_SeqDense(Mat A,Mat *matout)
1010289bc588SBarry Smith {
1011c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
10121b807ce4Svictorle   int          k,j,m,n,M,ierr;
101387828ca2SBarry Smith   PetscScalar  *v,tmp;
101448b35521SBarry Smith 
10153a40ed3dSBarry Smith   PetscFunctionBegin;
10161b807ce4Svictorle   v = mat->v; m = A->m; M = mat->lda; n = A->n;
10177c922b88SBarry Smith   if (!matout) { /* in place transpose */
1018a5ce6ee0Svictorle     if (m != n) {
1019a5ce6ee0Svictorle       SETERRQ(1,"Can not transpose non-square matrix in place");
1020d64ed03dSBarry Smith     } else {
1021d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1022289bc588SBarry Smith         for (k=0; k<j; k++) {
10231b807ce4Svictorle           tmp = v[j + k*M];
10241b807ce4Svictorle           v[j + k*M] = v[k + j*M];
10251b807ce4Svictorle           v[k + j*M] = tmp;
1026289bc588SBarry Smith         }
1027289bc588SBarry Smith       }
1028d64ed03dSBarry Smith     }
10293a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1030d3e5ee88SLois Curfman McInnes     Mat          tmat;
1031ec8511deSBarry Smith     Mat_SeqDense *tmatd;
103287828ca2SBarry Smith     PetscScalar  *v2;
1033ea709b57SSatish Balay 
1034273d9f13SBarry Smith     ierr  = MatCreateSeqDense(A->comm,A->n,A->m,PETSC_NULL,&tmat);CHKERRQ(ierr);
1035ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
10360de55854SLois Curfman McInnes     v = mat->v; v2 = tmatd->v;
1037d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
10381b807ce4Svictorle       for (k=0; k<m; k++) v2[j + k*n] = v[k + j*M];
1039d3e5ee88SLois Curfman McInnes     }
10406d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
10416d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1042d3e5ee88SLois Curfman McInnes     *matout = tmat;
104348b35521SBarry Smith   }
10443a40ed3dSBarry Smith   PetscFunctionReturn(0);
1045289bc588SBarry Smith }
1046289bc588SBarry Smith 
10474a2ae208SSatish Balay #undef __FUNCT__
10484a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
10498f6be9afSLois Curfman McInnes int MatEqual_SeqDense(Mat A1,Mat A2,PetscTruth *flg)
1050289bc588SBarry Smith {
1051c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1052c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
1053a43ee2ecSKris Buschelman   int          i,j;
105487828ca2SBarry Smith   PetscScalar  *v1 = mat1->v,*v2 = mat2->v;
10559ea5d5aeSSatish Balay 
10563a40ed3dSBarry Smith   PetscFunctionBegin;
1057273d9f13SBarry Smith   if (A1->m != A2->m) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1058273d9f13SBarry Smith   if (A1->n != A2->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
10591b807ce4Svictorle   for (i=0; i<A1->m; i++) {
10601b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
10611b807ce4Svictorle     for (j=0; j<A1->n; j++) {
10623a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
10631b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
10641b807ce4Svictorle     }
1065289bc588SBarry Smith   }
106677c4ece6SBarry Smith   *flg = PETSC_TRUE;
10673a40ed3dSBarry Smith   PetscFunctionReturn(0);
1068289bc588SBarry Smith }
1069289bc588SBarry Smith 
10704a2ae208SSatish Balay #undef __FUNCT__
10714a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
10728f6be9afSLois Curfman McInnes int MatGetDiagonal_SeqDense(Mat A,Vec v)
1073289bc588SBarry Smith {
1074c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
10757a97a34bSBarry Smith   int          ierr,i,n,len;
107687828ca2SBarry Smith   PetscScalar  *x,zero = 0.0;
107744cd7ae7SLois Curfman McInnes 
10783a40ed3dSBarry Smith   PetscFunctionBegin;
10797a97a34bSBarry Smith   ierr = VecSet(&zero,v);CHKERRQ(ierr);
10807a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
1081*b1d4fb26SBarry Smith   ierr = VecGetArrayFast(v,&x);CHKERRQ(ierr);
1082273d9f13SBarry Smith   len = PetscMin(A->m,A->n);
1083273d9f13SBarry Smith   if (n != A->m) SETERRQ(PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
108444cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
10851b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1086289bc588SBarry Smith   }
1087*b1d4fb26SBarry Smith   ierr = VecRestoreArrayFast(v,&x);CHKERRQ(ierr);
10883a40ed3dSBarry Smith   PetscFunctionReturn(0);
1089289bc588SBarry Smith }
1090289bc588SBarry Smith 
10914a2ae208SSatish Balay #undef __FUNCT__
10924a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
10938f6be9afSLois Curfman McInnes int MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1094289bc588SBarry Smith {
1095c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
109687828ca2SBarry Smith   PetscScalar  *l,*r,x,*v;
1097273d9f13SBarry Smith   int          ierr,i,j,m = A->m,n = A->n;
109855659b69SBarry Smith 
10993a40ed3dSBarry Smith   PetscFunctionBegin;
110028988994SBarry Smith   if (ll) {
11017a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
1102*b1d4fb26SBarry Smith     ierr = VecGetArrayFast(ll,&l);CHKERRQ(ierr);
1103273d9f13SBarry Smith     if (m != A->m) SETERRQ(PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1104da3a660dSBarry Smith     for (i=0; i<m; i++) {
1105da3a660dSBarry Smith       x = l[i];
1106da3a660dSBarry Smith       v = mat->v + i;
1107da3a660dSBarry Smith       for (j=0; j<n; j++) { (*v) *= x; v+= m;}
1108da3a660dSBarry Smith     }
1109*b1d4fb26SBarry Smith     ierr = VecRestoreArrayFast(ll,&l);CHKERRQ(ierr);
1110b0a32e0cSBarry Smith     PetscLogFlops(n*m);
1111da3a660dSBarry Smith   }
111228988994SBarry Smith   if (rr) {
11137a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
1114*b1d4fb26SBarry Smith     ierr = VecGetArrayFast(rr,&r);CHKERRQ(ierr);
1115273d9f13SBarry Smith     if (n != A->n) SETERRQ(PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1116da3a660dSBarry Smith     for (i=0; i<n; i++) {
1117da3a660dSBarry Smith       x = r[i];
1118da3a660dSBarry Smith       v = mat->v + i*m;
1119da3a660dSBarry Smith       for (j=0; j<m; j++) { (*v++) *= x;}
1120da3a660dSBarry Smith     }
1121*b1d4fb26SBarry Smith     ierr = VecRestoreArrayFast(rr,&r);CHKERRQ(ierr);
1122b0a32e0cSBarry Smith     PetscLogFlops(n*m);
1123da3a660dSBarry Smith   }
11243a40ed3dSBarry Smith   PetscFunctionReturn(0);
1125289bc588SBarry Smith }
1126289bc588SBarry Smith 
11274a2ae208SSatish Balay #undef __FUNCT__
11284a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1129064f8208SBarry Smith int MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1130289bc588SBarry Smith {
1131c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
113287828ca2SBarry Smith   PetscScalar  *v = mat->v;
1133329f5518SBarry Smith   PetscReal    sum = 0.0;
1134a5ce6ee0Svictorle   int          lda=mat->lda,m=A->m,i,j;
113555659b69SBarry Smith 
11363a40ed3dSBarry Smith   PetscFunctionBegin;
1137289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1138a5ce6ee0Svictorle     if (lda>m) {
1139a5ce6ee0Svictorle       for (j=0; j<A->n; j++) {
1140a5ce6ee0Svictorle 	v = mat->v+j*lda;
1141a5ce6ee0Svictorle 	for (i=0; i<m; i++) {
1142a5ce6ee0Svictorle #if defined(PETSC_USE_COMPLEX)
1143a5ce6ee0Svictorle 	  sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1144a5ce6ee0Svictorle #else
1145a5ce6ee0Svictorle 	  sum += (*v)*(*v); v++;
1146a5ce6ee0Svictorle #endif
1147a5ce6ee0Svictorle 	}
1148a5ce6ee0Svictorle       }
1149a5ce6ee0Svictorle     } else {
1150273d9f13SBarry Smith       for (i=0; i<A->n*A->m; i++) {
1151aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1152329f5518SBarry Smith 	sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1153289bc588SBarry Smith #else
1154289bc588SBarry Smith 	sum += (*v)*(*v); v++;
1155289bc588SBarry Smith #endif
1156289bc588SBarry Smith       }
1157a5ce6ee0Svictorle     }
1158064f8208SBarry Smith     *nrm = sqrt(sum);
1159b0a32e0cSBarry Smith     PetscLogFlops(2*A->n*A->m);
11603a40ed3dSBarry Smith   } else if (type == NORM_1) {
1161064f8208SBarry Smith     *nrm = 0.0;
1162273d9f13SBarry Smith     for (j=0; j<A->n; j++) {
11631b807ce4Svictorle       v = mat->v + j*mat->lda;
1164289bc588SBarry Smith       sum = 0.0;
1165273d9f13SBarry Smith       for (i=0; i<A->m; i++) {
116633a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1167289bc588SBarry Smith       }
1168064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1169289bc588SBarry Smith     }
1170b0a32e0cSBarry Smith     PetscLogFlops(A->n*A->m);
11713a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1172064f8208SBarry Smith     *nrm = 0.0;
1173273d9f13SBarry Smith     for (j=0; j<A->m; j++) {
1174289bc588SBarry Smith       v = mat->v + j;
1175289bc588SBarry Smith       sum = 0.0;
1176273d9f13SBarry Smith       for (i=0; i<A->n; i++) {
11771b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1178289bc588SBarry Smith       }
1179064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1180289bc588SBarry Smith     }
1181b0a32e0cSBarry Smith     PetscLogFlops(A->n*A->m);
11823a40ed3dSBarry Smith   } else {
118329bbc08cSBarry Smith     SETERRQ(PETSC_ERR_SUP,"No two norm");
1184289bc588SBarry Smith   }
11853a40ed3dSBarry Smith   PetscFunctionReturn(0);
1186289bc588SBarry Smith }
1187289bc588SBarry Smith 
11884a2ae208SSatish Balay #undef __FUNCT__
11894a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
11908f6be9afSLois Curfman McInnes int MatSetOption_SeqDense(Mat A,MatOption op)
1191289bc588SBarry Smith {
1192c0bbcb79SLois Curfman McInnes   Mat_SeqDense *aij = (Mat_SeqDense*)A->data;
119367e560aaSBarry Smith 
11943a40ed3dSBarry Smith   PetscFunctionBegin;
1195b5a2b587SKris Buschelman   switch (op) {
1196b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
1197b5a2b587SKris Buschelman     aij->roworiented = PETSC_TRUE;
1198b5a2b587SKris Buschelman     break;
1199b5a2b587SKris Buschelman   case MAT_COLUMN_ORIENTED:
1200b5a2b587SKris Buschelman     aij->roworiented = PETSC_FALSE;
1201b5a2b587SKris Buschelman     break;
1202b5a2b587SKris Buschelman   case MAT_ROWS_SORTED:
1203b5a2b587SKris Buschelman   case MAT_ROWS_UNSORTED:
1204b5a2b587SKris Buschelman   case MAT_COLUMNS_SORTED:
1205b5a2b587SKris Buschelman   case MAT_COLUMNS_UNSORTED:
1206b5a2b587SKris Buschelman   case MAT_NO_NEW_NONZERO_LOCATIONS:
1207b5a2b587SKris Buschelman   case MAT_YES_NEW_NONZERO_LOCATIONS:
1208b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
1209b5a2b587SKris Buschelman   case MAT_NO_NEW_DIAGONALS:
1210b5a2b587SKris Buschelman   case MAT_YES_NEW_DIAGONALS:
1211b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1212b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
1213b0a32e0cSBarry Smith     PetscLogInfo(A,"MatSetOption_SeqDense:Option ignored\n");
1214b5a2b587SKris Buschelman     break;
121577e54ba9SKris Buschelman   case MAT_SYMMETRIC:
121677e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
12179a4540c5SBarry Smith   case MAT_NOT_SYMMETRIC:
12189a4540c5SBarry Smith   case MAT_NOT_STRUCTURALLY_SYMMETRIC:
12199a4540c5SBarry Smith   case MAT_HERMITIAN:
12209a4540c5SBarry Smith   case MAT_NOT_HERMITIAN:
12219a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
12229a4540c5SBarry Smith   case MAT_NOT_SYMMETRY_ETERNAL:
122377e54ba9SKris Buschelman     break;
1224b5a2b587SKris Buschelman   default:
122529bbc08cSBarry Smith     SETERRQ(PETSC_ERR_SUP,"unknown option");
12263a40ed3dSBarry Smith   }
12273a40ed3dSBarry Smith   PetscFunctionReturn(0);
1228289bc588SBarry Smith }
1229289bc588SBarry Smith 
12304a2ae208SSatish Balay #undef __FUNCT__
12314a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
12328f6be9afSLois Curfman McInnes int MatZeroEntries_SeqDense(Mat A)
12336f0a148fSBarry Smith {
1234ec8511deSBarry Smith   Mat_SeqDense *l = (Mat_SeqDense*)A->data;
1235a5ce6ee0Svictorle   int          lda=l->lda,m=A->m,j, ierr;
12363a40ed3dSBarry Smith 
12373a40ed3dSBarry Smith   PetscFunctionBegin;
1238a5ce6ee0Svictorle   if (lda>m) {
1239a5ce6ee0Svictorle     for (j=0; j<A->n; j++) {
1240a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar)); CHKERRQ(ierr);
1241a5ce6ee0Svictorle     }
1242a5ce6ee0Svictorle   } else {
124387828ca2SBarry Smith     ierr = PetscMemzero(l->v,A->m*A->n*sizeof(PetscScalar));CHKERRQ(ierr);
1244a5ce6ee0Svictorle   }
12453a40ed3dSBarry Smith   PetscFunctionReturn(0);
12466f0a148fSBarry Smith }
12476f0a148fSBarry Smith 
12484a2ae208SSatish Balay #undef __FUNCT__
12494a2ae208SSatish Balay #define __FUNCT__ "MatGetBlockSize_SeqDense"
12508f6be9afSLois Curfman McInnes int MatGetBlockSize_SeqDense(Mat A,int *bs)
12514e220ebcSLois Curfman McInnes {
12523a40ed3dSBarry Smith   PetscFunctionBegin;
12534e220ebcSLois Curfman McInnes   *bs = 1;
12543a40ed3dSBarry Smith   PetscFunctionReturn(0);
12554e220ebcSLois Curfman McInnes }
12564e220ebcSLois Curfman McInnes 
12574a2ae208SSatish Balay #undef __FUNCT__
12584a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
1259268466fbSBarry Smith int MatZeroRows_SeqDense(Mat A,IS is,const PetscScalar *diag)
12606f0a148fSBarry Smith {
1261ec8511deSBarry Smith   Mat_SeqDense *l = (Mat_SeqDense*)A->data;
1262273d9f13SBarry Smith   int          n = A->n,i,j,ierr,N,*rows;
126387828ca2SBarry Smith   PetscScalar  *slot;
126455659b69SBarry Smith 
12653a40ed3dSBarry Smith   PetscFunctionBegin;
1266e03a110bSBarry Smith   ierr = ISGetLocalSize(is,&N);CHKERRQ(ierr);
126778b31e54SBarry Smith   ierr = ISGetIndices(is,&rows);CHKERRQ(ierr);
12686f0a148fSBarry Smith   for (i=0; i<N; i++) {
12696f0a148fSBarry Smith     slot = l->v + rows[i];
12706f0a148fSBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += n;}
12716f0a148fSBarry Smith   }
12726f0a148fSBarry Smith   if (diag) {
12736f0a148fSBarry Smith     for (i=0; i<N; i++) {
12746f0a148fSBarry Smith       slot = l->v + (n+1)*rows[i];
1275260925b8SBarry Smith       *slot = *diag;
12766f0a148fSBarry Smith     }
12776f0a148fSBarry Smith   }
1278260925b8SBarry Smith   ISRestoreIndices(is,&rows);
12793a40ed3dSBarry Smith   PetscFunctionReturn(0);
12806f0a148fSBarry Smith }
1281557bce09SLois Curfman McInnes 
12824a2ae208SSatish Balay #undef __FUNCT__
12834a2ae208SSatish Balay #define __FUNCT__ "MatGetArray_SeqDense"
12844e7234bfSBarry Smith int MatGetArray_SeqDense(Mat A,PetscScalar *array[])
128564e87e97SBarry Smith {
1286c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
12873a40ed3dSBarry Smith 
12883a40ed3dSBarry Smith   PetscFunctionBegin;
128964e87e97SBarry Smith   *array = mat->v;
12903a40ed3dSBarry Smith   PetscFunctionReturn(0);
129164e87e97SBarry Smith }
12920754003eSLois Curfman McInnes 
12934a2ae208SSatish Balay #undef __FUNCT__
12944a2ae208SSatish Balay #define __FUNCT__ "MatRestoreArray_SeqDense"
12954e7234bfSBarry Smith int MatRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1296ff14e315SSatish Balay {
12973a40ed3dSBarry Smith   PetscFunctionBegin;
129809b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
12993a40ed3dSBarry Smith   PetscFunctionReturn(0);
1300ff14e315SSatish Balay }
13010754003eSLois Curfman McInnes 
13024a2ae208SSatish Balay #undef __FUNCT__
13034a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
13047b2a1423SBarry Smith static int MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,int cs,MatReuse scall,Mat *B)
13050754003eSLois Curfman McInnes {
1306c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
1307273d9f13SBarry Smith   int          i,j,ierr,m = A->m,*irow,*icol,nrows,ncols;
130887828ca2SBarry Smith   PetscScalar  *av,*bv,*v = mat->v;
13090754003eSLois Curfman McInnes   Mat          newmat;
13100754003eSLois Curfman McInnes 
13113a40ed3dSBarry Smith   PetscFunctionBegin;
131278b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
131378b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1314e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1315e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
13160754003eSLois Curfman McInnes 
1317182d2002SSatish Balay   /* Check submatrixcall */
1318182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
1319182d2002SSatish Balay     int n_cols,n_rows;
1320182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
132129bbc08cSBarry Smith     if (n_rows != nrows || n_cols != ncols) SETERRQ(PETSC_ERR_ARG_SIZ,"Reused submatrix wrong size");
1322182d2002SSatish Balay     newmat = *B;
1323182d2002SSatish Balay   } else {
13240754003eSLois Curfman McInnes     /* Create and fill new matrix */
1325b4fd4287SBarry Smith     ierr = MatCreateSeqDense(A->comm,nrows,ncols,PETSC_NULL,&newmat);CHKERRQ(ierr);
1326182d2002SSatish Balay   }
1327182d2002SSatish Balay 
1328182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1329182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1330182d2002SSatish Balay 
1331182d2002SSatish Balay   for (i=0; i<ncols; i++) {
1332182d2002SSatish Balay     av = v + m*icol[i];
1333182d2002SSatish Balay     for (j=0; j<nrows; j++) {
1334182d2002SSatish Balay       *bv++ = av[irow[j]];
13350754003eSLois Curfman McInnes     }
13360754003eSLois Curfman McInnes   }
1337182d2002SSatish Balay 
1338182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
13396d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
13406d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
13410754003eSLois Curfman McInnes 
13420754003eSLois Curfman McInnes   /* Free work space */
134378b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
134478b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1345182d2002SSatish Balay   *B = newmat;
13463a40ed3dSBarry Smith   PetscFunctionReturn(0);
13470754003eSLois Curfman McInnes }
13480754003eSLois Curfman McInnes 
13494a2ae208SSatish Balay #undef __FUNCT__
13504a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
1351268466fbSBarry Smith int MatGetSubMatrices_SeqDense(Mat A,int n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1352905e6a2fSBarry Smith {
1353905e6a2fSBarry Smith   int ierr,i;
1354905e6a2fSBarry Smith 
13553a40ed3dSBarry Smith   PetscFunctionBegin;
1356905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1357b0a32e0cSBarry Smith     ierr = PetscMalloc((n+1)*sizeof(Mat),B);CHKERRQ(ierr);
1358905e6a2fSBarry Smith   }
1359905e6a2fSBarry Smith 
1360905e6a2fSBarry Smith   for (i=0; i<n; i++) {
13616a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1362905e6a2fSBarry Smith   }
13633a40ed3dSBarry Smith   PetscFunctionReturn(0);
1364905e6a2fSBarry Smith }
1365905e6a2fSBarry Smith 
13664a2ae208SSatish Balay #undef __FUNCT__
13674a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1368cb5b572fSBarry Smith int MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
13694b0e389bSBarry Smith {
13704b0e389bSBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense *)B->data;
1371a5ce6ee0Svictorle   int          lda1=a->lda,lda2=b->lda, m=A->m,n=A->n, j,ierr;
13723a40ed3dSBarry Smith 
13733a40ed3dSBarry Smith   PetscFunctionBegin;
137433f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
137533f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1376cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
13773a40ed3dSBarry Smith     PetscFunctionReturn(0);
13783a40ed3dSBarry Smith   }
13790dbb7854Svictorle   if (m != B->m || n != B->n) SETERRQ(PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1380a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
13810dbb7854Svictorle     for (j=0; j<n; j++) {
1382a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1383a5ce6ee0Svictorle     }
1384a5ce6ee0Svictorle   } else {
138587828ca2SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->m*A->n*sizeof(PetscScalar));CHKERRQ(ierr);
1386a5ce6ee0Svictorle   }
1387273d9f13SBarry Smith   PetscFunctionReturn(0);
1388273d9f13SBarry Smith }
1389273d9f13SBarry Smith 
13904a2ae208SSatish Balay #undef __FUNCT__
13914a2ae208SSatish Balay #define __FUNCT__ "MatSetUpPreallocation_SeqDense"
1392273d9f13SBarry Smith int MatSetUpPreallocation_SeqDense(Mat A)
1393273d9f13SBarry Smith {
1394273d9f13SBarry Smith   int        ierr;
1395273d9f13SBarry Smith 
1396273d9f13SBarry Smith   PetscFunctionBegin;
1397273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
13983a40ed3dSBarry Smith   PetscFunctionReturn(0);
13994b0e389bSBarry Smith }
14004b0e389bSBarry Smith 
1401289bc588SBarry Smith /* -------------------------------------------------------------------*/
1402a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = {MatSetValues_SeqDense,
1403905e6a2fSBarry Smith        MatGetRow_SeqDense,
1404905e6a2fSBarry Smith        MatRestoreRow_SeqDense,
1405905e6a2fSBarry Smith        MatMult_SeqDense,
140697304618SKris Buschelman /* 4*/ MatMultAdd_SeqDense,
14077c922b88SBarry Smith        MatMultTranspose_SeqDense,
14087c922b88SBarry Smith        MatMultTransposeAdd_SeqDense,
1409905e6a2fSBarry Smith        MatSolve_SeqDense,
1410905e6a2fSBarry Smith        MatSolveAdd_SeqDense,
14117c922b88SBarry Smith        MatSolveTranspose_SeqDense,
141297304618SKris Buschelman /*10*/ MatSolveTransposeAdd_SeqDense,
1413905e6a2fSBarry Smith        MatLUFactor_SeqDense,
1414905e6a2fSBarry Smith        MatCholeskyFactor_SeqDense,
1415ec8511deSBarry Smith        MatRelax_SeqDense,
1416ec8511deSBarry Smith        MatTranspose_SeqDense,
141797304618SKris Buschelman /*15*/ MatGetInfo_SeqDense,
1418905e6a2fSBarry Smith        MatEqual_SeqDense,
1419905e6a2fSBarry Smith        MatGetDiagonal_SeqDense,
1420905e6a2fSBarry Smith        MatDiagonalScale_SeqDense,
1421905e6a2fSBarry Smith        MatNorm_SeqDense,
142297304618SKris Buschelman /*20*/ 0,
1423905e6a2fSBarry Smith        0,
1424905e6a2fSBarry Smith        0,
1425905e6a2fSBarry Smith        MatSetOption_SeqDense,
1426905e6a2fSBarry Smith        MatZeroEntries_SeqDense,
142797304618SKris Buschelman /*25*/ MatZeroRows_SeqDense,
1428905e6a2fSBarry Smith        MatLUFactorSymbolic_SeqDense,
1429905e6a2fSBarry Smith        MatLUFactorNumeric_SeqDense,
1430905e6a2fSBarry Smith        MatCholeskyFactorSymbolic_SeqDense,
1431905e6a2fSBarry Smith        MatCholeskyFactorNumeric_SeqDense,
143297304618SKris Buschelman /*30*/ MatSetUpPreallocation_SeqDense,
1433273d9f13SBarry Smith        0,
1434905e6a2fSBarry Smith        0,
1435905e6a2fSBarry Smith        MatGetArray_SeqDense,
1436905e6a2fSBarry Smith        MatRestoreArray_SeqDense,
143797304618SKris Buschelman /*35*/ MatDuplicate_SeqDense,
1438a5ae1ecdSBarry Smith        0,
1439a5ae1ecdSBarry Smith        0,
1440a5ae1ecdSBarry Smith        0,
1441a5ae1ecdSBarry Smith        0,
144297304618SKris Buschelman /*40*/ MatAXPY_SeqDense,
1443a5ae1ecdSBarry Smith        MatGetSubMatrices_SeqDense,
1444a5ae1ecdSBarry Smith        0,
14454b0e389bSBarry Smith        MatGetValues_SeqDense,
1446a5ae1ecdSBarry Smith        MatCopy_SeqDense,
144797304618SKris Buschelman /*45*/ 0,
1448a5ae1ecdSBarry Smith        MatScale_SeqDense,
1449a5ae1ecdSBarry Smith        0,
1450a5ae1ecdSBarry Smith        0,
1451a5ae1ecdSBarry Smith        0,
145297304618SKris Buschelman /*50*/ MatGetBlockSize_SeqDense,
1453a5ae1ecdSBarry Smith        0,
1454a5ae1ecdSBarry Smith        0,
1455a5ae1ecdSBarry Smith        0,
1456a5ae1ecdSBarry Smith        0,
145797304618SKris Buschelman /*55*/ 0,
1458a5ae1ecdSBarry Smith        0,
1459a5ae1ecdSBarry Smith        0,
1460a5ae1ecdSBarry Smith        0,
1461a5ae1ecdSBarry Smith        0,
146297304618SKris Buschelman /*60*/ 0,
1463e03a110bSBarry Smith        MatDestroy_SeqDense,
1464e03a110bSBarry Smith        MatView_SeqDense,
146597304618SKris Buschelman        MatGetPetscMaps_Petsc,
146697304618SKris Buschelman        0,
146797304618SKris Buschelman /*65*/ 0,
146897304618SKris Buschelman        0,
146997304618SKris Buschelman        0,
147097304618SKris Buschelman        0,
147197304618SKris Buschelman        0,
147297304618SKris Buschelman /*70*/ 0,
147397304618SKris Buschelman        0,
147497304618SKris Buschelman        0,
147597304618SKris Buschelman        0,
147697304618SKris Buschelman        0,
147797304618SKris Buschelman /*75*/ 0,
147897304618SKris Buschelman        0,
147997304618SKris Buschelman        0,
148097304618SKris Buschelman        0,
148197304618SKris Buschelman        0,
148297304618SKris Buschelman /*80*/ 0,
148397304618SKris Buschelman        0,
148497304618SKris Buschelman        0,
148597304618SKris Buschelman        0,
148697304618SKris Buschelman /*85*/ MatLoad_SeqDense};
148790ace30eSBarry Smith 
14884a2ae208SSatish Balay #undef __FUNCT__
14894a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
14904b828684SBarry Smith /*@C
1491fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
1492d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
1493d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
1494289bc588SBarry Smith 
1495db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
1496db81eaa0SLois Curfman McInnes 
149720563c6bSBarry Smith    Input Parameters:
1498db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
14990c775827SLois Curfman McInnes .  m - number of rows
150018f449edSLois Curfman McInnes .  n - number of columns
1501db81eaa0SLois Curfman McInnes -  data - optional location of matrix data.  Set data=PETSC_NULL for PETSc
1502dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
150320563c6bSBarry Smith 
150420563c6bSBarry Smith    Output Parameter:
150544cd7ae7SLois Curfman McInnes .  A - the matrix
150620563c6bSBarry Smith 
1507b259b22eSLois Curfman McInnes    Notes:
150818f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
150918f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
1510b4fd4287SBarry Smith    set data=PETSC_NULL.
151118f449edSLois Curfman McInnes 
1512027ccd11SLois Curfman McInnes    Level: intermediate
1513027ccd11SLois Curfman McInnes 
1514dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
1515d65003e9SLois Curfman McInnes 
1516db81eaa0SLois Curfman McInnes .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues()
151720563c6bSBarry Smith @*/
151887828ca2SBarry Smith int MatCreateSeqDense(MPI_Comm comm,int m,int n,PetscScalar *data,Mat *A)
1519289bc588SBarry Smith {
1520273d9f13SBarry Smith   int ierr;
15213b2fbd54SBarry Smith 
15223a40ed3dSBarry Smith   PetscFunctionBegin;
1523273d9f13SBarry Smith   ierr = MatCreate(comm,m,n,m,n,A);CHKERRQ(ierr);
1524273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
1525273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
1526273d9f13SBarry Smith   PetscFunctionReturn(0);
1527273d9f13SBarry Smith }
1528273d9f13SBarry Smith 
15294a2ae208SSatish Balay #undef __FUNCT__
15304a2ae208SSatish Balay #define __FUNCT__ "MatSeqDensePreallocation"
1531273d9f13SBarry Smith /*@C
1532273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
1533273d9f13SBarry Smith 
1534273d9f13SBarry Smith    Collective on MPI_Comm
1535273d9f13SBarry Smith 
1536273d9f13SBarry Smith    Input Parameters:
1537273d9f13SBarry Smith +  A - the matrix
1538273d9f13SBarry Smith -  data - the array (or PETSC_NULL)
1539273d9f13SBarry Smith 
1540273d9f13SBarry Smith    Notes:
1541273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
1542273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
1543273d9f13SBarry Smith    set data=PETSC_NULL.
1544273d9f13SBarry Smith 
1545273d9f13SBarry Smith    Level: intermediate
1546273d9f13SBarry Smith 
1547273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
1548273d9f13SBarry Smith 
1549273d9f13SBarry Smith .seealso: MatCreate(), MatCreateMPIDense(), MatSetValues()
1550273d9f13SBarry Smith @*/
1551ca01db9bSBarry Smith int MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
1552273d9f13SBarry Smith {
1553ca01db9bSBarry Smith   int ierr,(*f)(Mat,PetscScalar[]);
1554a23d5eceSKris Buschelman 
1555a23d5eceSKris Buschelman   PetscFunctionBegin;
1556a23d5eceSKris Buschelman   ierr = PetscObjectQueryFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",(void (**)(void))&f);CHKERRQ(ierr);
1557a23d5eceSKris Buschelman   if (f) {
1558a23d5eceSKris Buschelman     ierr = (*f)(B,data);CHKERRQ(ierr);
1559a23d5eceSKris Buschelman   }
1560a23d5eceSKris Buschelman   PetscFunctionReturn(0);
1561a23d5eceSKris Buschelman }
1562a23d5eceSKris Buschelman 
1563a23d5eceSKris Buschelman EXTERN_C_BEGIN
1564a23d5eceSKris Buschelman #undef __FUNCT__
1565a23d5eceSKris Buschelman #define __FUNCT__ "MatSeqDensePreallocation_SeqDense"
1566a23d5eceSKris Buschelman int MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
1567a23d5eceSKris Buschelman {
1568273d9f13SBarry Smith   Mat_SeqDense *b;
1569273d9f13SBarry Smith   int          ierr;
1570273d9f13SBarry Smith 
1571273d9f13SBarry Smith   PetscFunctionBegin;
1572273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
1573273d9f13SBarry Smith   b               = (Mat_SeqDense*)B->data;
1574273d9f13SBarry Smith   if (!data) {
157587828ca2SBarry Smith     ierr          = PetscMalloc((B->m*B->n+1)*sizeof(PetscScalar),&b->v);CHKERRQ(ierr);
157687828ca2SBarry Smith     ierr          = PetscMemzero(b->v,B->m*B->n*sizeof(PetscScalar));CHKERRQ(ierr);
1577273d9f13SBarry Smith     b->user_alloc = PETSC_FALSE;
157887828ca2SBarry Smith     PetscLogObjectMemory(B,B->n*B->m*sizeof(PetscScalar));
1579273d9f13SBarry Smith   } else { /* user-allocated storage */
1580273d9f13SBarry Smith     b->v          = data;
1581273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
1582273d9f13SBarry Smith   }
1583273d9f13SBarry Smith   PetscFunctionReturn(0);
1584273d9f13SBarry Smith }
1585a23d5eceSKris Buschelman EXTERN_C_END
1586273d9f13SBarry Smith 
15871b807ce4Svictorle #undef __FUNCT__
15881b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
15891b807ce4Svictorle /*@C
15901b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
15911b807ce4Svictorle 
15921b807ce4Svictorle   Input parameter:
15931b807ce4Svictorle + A - the matrix
15941b807ce4Svictorle - lda - the leading dimension
15951b807ce4Svictorle 
15961b807ce4Svictorle   Notes:
15971b807ce4Svictorle   This routine is to be used in conjunction with MatSeqDenseSetPreallocation;
15981b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
15991b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
16001b807ce4Svictorle 
16011b807ce4Svictorle   Level: intermediate
16021b807ce4Svictorle 
16031b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
16041b807ce4Svictorle 
16051b807ce4Svictorle .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation()
16061b807ce4Svictorle @*/
16071b807ce4Svictorle int MatSeqDenseSetLDA(Mat B,int lda)
16081b807ce4Svictorle {
16091b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
16101b807ce4Svictorle   PetscFunctionBegin;
16111b807ce4Svictorle   if (lda<B->m) SETERRQ(1,"LDA must be at least matrix i dimension");
16121b807ce4Svictorle   b->lda = lda;
16131b807ce4Svictorle   PetscFunctionReturn(0);
16141b807ce4Svictorle }
16151b807ce4Svictorle 
16160bad9183SKris Buschelman /*MC
1617fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
16180bad9183SKris Buschelman 
16190bad9183SKris Buschelman    Options Database Keys:
16200bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
16210bad9183SKris Buschelman 
16220bad9183SKris Buschelman   Level: beginner
16230bad9183SKris Buschelman 
16240bad9183SKris Buschelman .seealso: MatCreateSeqDense
16250bad9183SKris Buschelman M*/
16260bad9183SKris Buschelman 
1627273d9f13SBarry Smith EXTERN_C_BEGIN
16284a2ae208SSatish Balay #undef __FUNCT__
16294a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
1630273d9f13SBarry Smith int MatCreate_SeqDense(Mat B)
1631273d9f13SBarry Smith {
1632273d9f13SBarry Smith   Mat_SeqDense *b;
1633273d9f13SBarry Smith   int          ierr,size;
1634273d9f13SBarry Smith 
1635273d9f13SBarry Smith   PetscFunctionBegin;
1636273d9f13SBarry Smith   ierr = MPI_Comm_size(B->comm,&size);CHKERRQ(ierr);
163729bbc08cSBarry Smith   if (size > 1) SETERRQ(PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
163855659b69SBarry Smith 
1639273d9f13SBarry Smith   B->m = B->M = PetscMax(B->m,B->M);
1640273d9f13SBarry Smith   B->n = B->N = PetscMax(B->n,B->N);
1641273d9f13SBarry Smith 
1642b0a32e0cSBarry Smith   ierr            = PetscNew(Mat_SeqDense,&b);CHKERRQ(ierr);
1643549d3d68SSatish Balay   ierr            = PetscMemzero(b,sizeof(Mat_SeqDense));CHKERRQ(ierr);
1644549d3d68SSatish Balay   ierr            = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
164544cd7ae7SLois Curfman McInnes   B->factor       = 0;
164690f02eecSBarry Smith   B->mapping      = 0;
1647b0a32e0cSBarry Smith   PetscLogObjectMemory(B,sizeof(struct _p_Mat));
164844cd7ae7SLois Curfman McInnes   B->data         = (void*)b;
164918f449edSLois Curfman McInnes 
16508a124369SBarry Smith   ierr = PetscMapCreateMPI(B->comm,B->m,B->m,&B->rmap);CHKERRQ(ierr);
16518a124369SBarry Smith   ierr = PetscMapCreateMPI(B->comm,B->n,B->n,&B->cmap);CHKERRQ(ierr);
1652a5ae1ecdSBarry Smith 
165344cd7ae7SLois Curfman McInnes   b->pivots       = 0;
1654273d9f13SBarry Smith   b->roworiented  = PETSC_TRUE;
1655273d9f13SBarry Smith   b->v            = 0;
16561b807ce4Svictorle   b->lda          = B->m;
16574e220ebcSLois Curfman McInnes 
1658a23d5eceSKris Buschelman   ierr = PetscObjectComposeFunctionDynamic((PetscObject)B,"MatSeqDenseSetPreallocation_C",
1659a23d5eceSKris Buschelman                                     "MatSeqDenseSetPreallocation_SeqDense",
1660a23d5eceSKris Buschelman                                      MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
16613a40ed3dSBarry Smith   PetscFunctionReturn(0);
1662289bc588SBarry Smith }
1663273d9f13SBarry Smith EXTERN_C_END
1664