xref: /petsc/src/mat/impls/dense/seq/dense.c (revision e0877f539457ad1ce8178bc0750eac5ffa490a67)
1be1d678aSKris Buschelman 
267e560aaSBarry Smith /*
367e560aaSBarry Smith      Defines the basic matrix operations for sequential dense.
467e560aaSBarry Smith */
5289bc588SBarry Smith 
6dec5eb66SMatthew G Knepley #include <../src/mat/impls/dense/seq/dense.h> /*I "petscmat.h" I*/
7c6db04a5SJed Brown #include <petscblaslapack.h>
8289bc588SBarry Smith 
96a63e612SBarry Smith #include <../src/mat/impls/aij/seq/aij.h>
10b2573a8aSBarry Smith 
116a63e612SBarry Smith #undef __FUNCT__
12abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAPNumeric_SeqDense_SeqDense"
13abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C)
14abc3b08eSStefano Zampini {
15abc3b08eSStefano Zampini   Mat_SeqDense   *c = (Mat_SeqDense*)(C->data);
16abc3b08eSStefano Zampini   PetscErrorCode ierr;
17abc3b08eSStefano Zampini 
18abc3b08eSStefano Zampini   PetscFunctionBegin;
19abc3b08eSStefano Zampini   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,P,c->ptapwork);CHKERRQ(ierr);
20abc3b08eSStefano Zampini   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(P,c->ptapwork,C);CHKERRQ(ierr);
21abc3b08eSStefano Zampini   PetscFunctionReturn(0);
22abc3b08eSStefano Zampini }
23abc3b08eSStefano Zampini 
24abc3b08eSStefano Zampini #undef __FUNCT__
25abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAPSymbolic_SeqDense_SeqDense"
26abc3b08eSStefano Zampini PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat *C)
27abc3b08eSStefano Zampini {
28abc3b08eSStefano Zampini   Mat_SeqDense   *c;
29abc3b08eSStefano Zampini   PetscErrorCode ierr;
30abc3b08eSStefano Zampini 
31abc3b08eSStefano Zampini   PetscFunctionBegin;
32abc3b08eSStefano Zampini   ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),P->cmap->N,P->cmap->N,NULL,C);CHKERRQ(ierr);
33abc3b08eSStefano Zampini   c = (Mat_SeqDense*)((*C)->data);
34abc3b08eSStefano Zampini   ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),A->rmap->N,P->cmap->N,NULL,&c->ptapwork);CHKERRQ(ierr);
35abc3b08eSStefano Zampini   PetscFunctionReturn(0);
36abc3b08eSStefano Zampini }
37abc3b08eSStefano Zampini 
38abc3b08eSStefano Zampini #undef __FUNCT__
39abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAP_SeqDense_SeqDense"
40abc3b08eSStefano Zampini PETSC_EXTERN PetscErrorCode MatPtAP_SeqDense_SeqDense(Mat A,Mat P,MatReuse reuse,PetscReal fill,Mat *C)
41abc3b08eSStefano Zampini {
42abc3b08eSStefano Zampini   PetscErrorCode ierr;
43abc3b08eSStefano Zampini 
44abc3b08eSStefano Zampini   PetscFunctionBegin;
45abc3b08eSStefano Zampini   if (reuse == MAT_INITIAL_MATRIX) {
46abc3b08eSStefano Zampini     ierr = MatPtAPSymbolic_SeqDense_SeqDense(A,P,fill,C);CHKERRQ(ierr);
47abc3b08eSStefano Zampini   }
48abc3b08eSStefano Zampini   ierr = PetscLogEventBegin(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr);
49abc3b08eSStefano Zampini   ierr = (*(*C)->ops->ptapnumeric)(A,P,*C);CHKERRQ(ierr);
50abc3b08eSStefano Zampini   ierr = PetscLogEventEnd(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr);
51abc3b08eSStefano Zampini   PetscFunctionReturn(0);
52abc3b08eSStefano Zampini }
53abc3b08eSStefano Zampini 
54abc3b08eSStefano Zampini #undef __FUNCT__
55b49cda9fSStefano Zampini #define __FUNCT__ "MatConvert_SeqAIJ_SeqDense"
56b49cda9fSStefano Zampini PETSC_EXTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat)
57b49cda9fSStefano Zampini {
58b49cda9fSStefano Zampini   Mat            B;
59b49cda9fSStefano Zampini   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)A->data;
60b49cda9fSStefano Zampini   Mat_SeqDense   *b;
61b49cda9fSStefano Zampini   PetscErrorCode ierr;
62b49cda9fSStefano Zampini   PetscInt       *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i;
63b49cda9fSStefano Zampini   MatScalar      *av=a->a;
64b49cda9fSStefano Zampini 
65b49cda9fSStefano Zampini   PetscFunctionBegin;
66b49cda9fSStefano Zampini   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
67b49cda9fSStefano Zampini   ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr);
68b49cda9fSStefano Zampini   ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr);
69b49cda9fSStefano Zampini   ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr);
70b49cda9fSStefano Zampini 
71b49cda9fSStefano Zampini   b  = (Mat_SeqDense*)(B->data);
72b49cda9fSStefano Zampini   for (i=0; i<m; i++) {
73b49cda9fSStefano Zampini     PetscInt j;
74b49cda9fSStefano Zampini     for (j=0;j<ai[1]-ai[0];j++) {
75b49cda9fSStefano Zampini       b->v[*aj*m+i] = *av;
76b49cda9fSStefano Zampini       aj++;
77b49cda9fSStefano Zampini       av++;
78b49cda9fSStefano Zampini     }
79b49cda9fSStefano Zampini     ai++;
80b49cda9fSStefano Zampini   }
81b49cda9fSStefano Zampini   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
82b49cda9fSStefano Zampini   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
83b49cda9fSStefano Zampini 
84511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
8528be2f97SBarry Smith     ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr);
86b49cda9fSStefano Zampini   } else {
87b49cda9fSStefano Zampini     *newmat = B;
88b49cda9fSStefano Zampini   }
89b49cda9fSStefano Zampini   PetscFunctionReturn(0);
90b49cda9fSStefano Zampini }
91b49cda9fSStefano Zampini 
92b49cda9fSStefano Zampini #undef __FUNCT__
936a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ"
948cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
956a63e612SBarry Smith {
966a63e612SBarry Smith   Mat            B;
976a63e612SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
986a63e612SBarry Smith   PetscErrorCode ierr;
999399e1b8SMatthew G. Knepley   PetscInt       i, j;
1009399e1b8SMatthew G. Knepley   PetscInt       *rows, *nnz;
1019399e1b8SMatthew G. Knepley   MatScalar      *aa = a->v, *vals;
1026a63e612SBarry Smith 
1036a63e612SBarry Smith   PetscFunctionBegin;
104ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
1056a63e612SBarry Smith   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
1066a63e612SBarry Smith   ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr);
1079399e1b8SMatthew G. Knepley   ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr);
1089399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
1099399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i];
1106a63e612SBarry Smith     aa += a->lda;
1116a63e612SBarry Smith   }
1129399e1b8SMatthew G. Knepley   ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr);
1139399e1b8SMatthew G. Knepley   aa = a->v;
1149399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
1159399e1b8SMatthew G. Knepley     PetscInt numRows = 0;
1169399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];}
1179399e1b8SMatthew G. Knepley     ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr);
1189399e1b8SMatthew G. Knepley     aa  += a->lda;
1199399e1b8SMatthew G. Knepley   }
1209399e1b8SMatthew G. Knepley   ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr);
1216a63e612SBarry Smith   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1226a63e612SBarry Smith   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1236a63e612SBarry Smith 
124511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
12528be2f97SBarry Smith     ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr);
1266a63e612SBarry Smith   } else {
1276a63e612SBarry Smith     *newmat = B;
1286a63e612SBarry Smith   }
1296a63e612SBarry Smith   PetscFunctionReturn(0);
1306a63e612SBarry Smith }
1316a63e612SBarry Smith 
1324a2ae208SSatish Balay #undef __FUNCT__
1334a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense"
134*e0877f53SBarry Smith static PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
1351987afe7SBarry Smith {
1361987afe7SBarry Smith   Mat_SeqDense   *x     = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
137f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
13813f74950SBarry Smith   PetscInt       j;
1390805154bSBarry Smith   PetscBLASInt   N,m,ldax,lday,one = 1;
140efee365bSSatish Balay   PetscErrorCode ierr;
1413a40ed3dSBarry Smith 
1423a40ed3dSBarry Smith   PetscFunctionBegin;
143c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr);
144c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr);
145c5df96a5SBarry Smith   ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr);
146c5df96a5SBarry Smith   ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr);
147a5ce6ee0Svictorle   if (ldax>m || lday>m) {
148d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
1498b83055fSJed Brown       PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one));
150a5ce6ee0Svictorle     }
151a5ce6ee0Svictorle   } else {
1528b83055fSJed Brown     PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one));
153a5ce6ee0Svictorle   }
154a3fa217bSJose E. Roman   ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr);
1550450473dSBarry Smith   ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr);
1563a40ed3dSBarry Smith   PetscFunctionReturn(0);
1571987afe7SBarry Smith }
1581987afe7SBarry Smith 
1594a2ae208SSatish Balay #undef __FUNCT__
1604a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense"
161*e0877f53SBarry Smith static PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
162289bc588SBarry Smith {
163d0f46423SBarry Smith   PetscInt N = A->rmap->n*A->cmap->n;
1643a40ed3dSBarry Smith 
1653a40ed3dSBarry Smith   PetscFunctionBegin;
1664e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
1674e220ebcSLois Curfman McInnes   info->nz_allocated      = (double)N;
1686de62eeeSBarry Smith   info->nz_used           = (double)N;
1696de62eeeSBarry Smith   info->nz_unneeded       = (double)0;
1704e220ebcSLois Curfman McInnes   info->assemblies        = (double)A->num_ass;
1714e220ebcSLois Curfman McInnes   info->mallocs           = 0;
1727adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
1734e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
1744e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
1754e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
1763a40ed3dSBarry Smith   PetscFunctionReturn(0);
177289bc588SBarry Smith }
178289bc588SBarry Smith 
1794a2ae208SSatish Balay #undef __FUNCT__
1804a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense"
181*e0877f53SBarry Smith static PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
18280cd9d93SLois Curfman McInnes {
183273d9f13SBarry Smith   Mat_SeqDense   *a     = (Mat_SeqDense*)A->data;
184f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
185efee365bSSatish Balay   PetscErrorCode ierr;
186c5df96a5SBarry Smith   PetscBLASInt   one = 1,j,nz,lda;
18780cd9d93SLois Curfman McInnes 
1883a40ed3dSBarry Smith   PetscFunctionBegin;
189c5df96a5SBarry Smith   ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr);
190d0f46423SBarry Smith   if (lda>A->rmap->n) {
191c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr);
192d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1938b83055fSJed Brown       PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one));
194a5ce6ee0Svictorle     }
195a5ce6ee0Svictorle   } else {
196c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr);
1978b83055fSJed Brown     PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one));
198a5ce6ee0Svictorle   }
199efee365bSSatish Balay   ierr = PetscLogFlops(nz);CHKERRQ(ierr);
2003a40ed3dSBarry Smith   PetscFunctionReturn(0);
20180cd9d93SLois Curfman McInnes }
20280cd9d93SLois Curfman McInnes 
2031cbb95d3SBarry Smith #undef __FUNCT__
2041cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense"
205*e0877f53SBarry Smith static PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
2061cbb95d3SBarry Smith {
2071cbb95d3SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
208d0f46423SBarry Smith   PetscInt     i,j,m = A->rmap->n,N;
2091cbb95d3SBarry Smith   PetscScalar  *v = a->v;
2101cbb95d3SBarry Smith 
2111cbb95d3SBarry Smith   PetscFunctionBegin;
2121cbb95d3SBarry Smith   *fl = PETSC_FALSE;
213d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
2141cbb95d3SBarry Smith   N = a->lda;
2151cbb95d3SBarry Smith 
2161cbb95d3SBarry Smith   for (i=0; i<m; i++) {
2171cbb95d3SBarry Smith     for (j=i+1; j<m; j++) {
2181cbb95d3SBarry Smith       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0);
2191cbb95d3SBarry Smith     }
2201cbb95d3SBarry Smith   }
2211cbb95d3SBarry Smith   *fl = PETSC_TRUE;
2221cbb95d3SBarry Smith   PetscFunctionReturn(0);
2231cbb95d3SBarry Smith }
2241cbb95d3SBarry Smith 
225b24902e0SBarry Smith #undef __FUNCT__
226b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense"
227*e0877f53SBarry Smith static PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues)
228b24902e0SBarry Smith {
229b24902e0SBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l;
230b24902e0SBarry Smith   PetscErrorCode ierr;
231b24902e0SBarry Smith   PetscInt       lda = (PetscInt)mat->lda,j,m;
232b24902e0SBarry Smith 
233b24902e0SBarry Smith   PetscFunctionBegin;
234aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr);
235aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr);
2360298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr);
237b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
238b24902e0SBarry Smith     l = (Mat_SeqDense*)newi->data;
239d0f46423SBarry Smith     if (lda>A->rmap->n) {
240d0f46423SBarry Smith       m = A->rmap->n;
241d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
242b24902e0SBarry Smith         ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
243b24902e0SBarry Smith       }
244b24902e0SBarry Smith     } else {
245d0f46423SBarry Smith       ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
246b24902e0SBarry Smith     }
247b24902e0SBarry Smith   }
248b24902e0SBarry Smith   newi->assembled = PETSC_TRUE;
249b24902e0SBarry Smith   PetscFunctionReturn(0);
250b24902e0SBarry Smith }
251b24902e0SBarry Smith 
2524a2ae208SSatish Balay #undef __FUNCT__
2534a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense"
254*e0877f53SBarry Smith static PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
25502cad45dSBarry Smith {
2566849ba73SBarry Smith   PetscErrorCode ierr;
25702cad45dSBarry Smith 
2583a40ed3dSBarry Smith   PetscFunctionBegin;
259ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr);
260d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
2615c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
262719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr);
263b24902e0SBarry Smith   PetscFunctionReturn(0);
264b24902e0SBarry Smith }
265b24902e0SBarry Smith 
2666ee01492SSatish Balay 
267*e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*);
268719d5645SBarry Smith 
2694a2ae208SSatish Balay #undef __FUNCT__
2704a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
271*e0877f53SBarry Smith static PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
272289bc588SBarry Smith {
2734482741eSBarry Smith   MatFactorInfo  info;
274a093e273SMatthew Knepley   PetscErrorCode ierr;
2753a40ed3dSBarry Smith 
2763a40ed3dSBarry Smith   PetscFunctionBegin;
277c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
278719d5645SBarry Smith   ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr);
2793a40ed3dSBarry Smith   PetscFunctionReturn(0);
280289bc588SBarry Smith }
2816ee01492SSatish Balay 
2820b4b3355SBarry Smith #undef __FUNCT__
2834a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense"
284*e0877f53SBarry Smith static PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
285289bc588SBarry Smith {
286c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
2876849ba73SBarry Smith   PetscErrorCode    ierr;
288f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
289f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
290c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
29167e560aaSBarry Smith 
2923a40ed3dSBarry Smith   PetscFunctionBegin;
293c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
294f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
2951ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
296d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
297d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
298ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
299e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
300ae7cfcebSSatish Balay #else
3018b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
302e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
303ae7cfcebSSatish Balay #endif
304d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
305ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
306e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
307ae7cfcebSSatish Balay #else
3088b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
309e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
310ae7cfcebSSatish Balay #endif
3112205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
312f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
3131ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
314dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
3153a40ed3dSBarry Smith   PetscFunctionReturn(0);
316289bc588SBarry Smith }
3176ee01492SSatish Balay 
3184a2ae208SSatish Balay #undef __FUNCT__
31985e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense"
320*e0877f53SBarry Smith static PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X)
32185e2c93fSHong Zhang {
32285e2c93fSHong Zhang   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
32385e2c93fSHong Zhang   PetscErrorCode ierr;
32485e2c93fSHong Zhang   PetscScalar    *b,*x;
325efb80c78SLisandro Dalcin   PetscInt       n;
326783b601eSJed Brown   PetscBLASInt   nrhs,info,m;
327bda8bf91SBarry Smith   PetscBool      flg;
32885e2c93fSHong Zhang 
32985e2c93fSHong Zhang   PetscFunctionBegin;
330c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
3310298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
332ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
3330298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
334ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");
335bda8bf91SBarry Smith 
3360298fd71SBarry Smith   ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr);
337c5df96a5SBarry Smith   ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr);
3388c778c55SBarry Smith   ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr);
3398c778c55SBarry Smith   ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr);
34085e2c93fSHong Zhang 
341f272c775SHong Zhang   ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr);
34285e2c93fSHong Zhang 
34385e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
34485e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS)
34585e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
34685e2c93fSHong Zhang #else
3478b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
34885e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
34985e2c93fSHong Zhang #endif
35085e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
35185e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS)
35285e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
35385e2c93fSHong Zhang #else
3548b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info));
35585e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
35685e2c93fSHong Zhang #endif
3572205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
35885e2c93fSHong Zhang 
3598c778c55SBarry Smith   ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr);
3608c778c55SBarry Smith   ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr);
36185e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
36285e2c93fSHong Zhang   PetscFunctionReturn(0);
36385e2c93fSHong Zhang }
36485e2c93fSHong Zhang 
36585e2c93fSHong Zhang #undef __FUNCT__
3664a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
367*e0877f53SBarry Smith static PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
368da3a660dSBarry Smith {
369c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
370dfbe8321SBarry Smith   PetscErrorCode    ierr;
371f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
372f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
373c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
37467e560aaSBarry Smith 
3753a40ed3dSBarry Smith   PetscFunctionBegin;
376c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
377f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
3781ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
379d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
380752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
381da3a660dSBarry Smith   if (mat->pivots) {
382ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
383e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
384ae7cfcebSSatish Balay #else
3858b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
386e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
387ae7cfcebSSatish Balay #endif
3887a97a34bSBarry Smith   } else {
389ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
390e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
391ae7cfcebSSatish Balay #else
3928b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
393e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
394ae7cfcebSSatish Balay #endif
395da3a660dSBarry Smith   }
396f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
3971ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
398dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
3993a40ed3dSBarry Smith   PetscFunctionReturn(0);
400da3a660dSBarry Smith }
4016ee01492SSatish Balay 
4024a2ae208SSatish Balay #undef __FUNCT__
4034a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
404*e0877f53SBarry Smith static PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
405da3a660dSBarry Smith {
406c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
407dfbe8321SBarry Smith   PetscErrorCode    ierr;
408f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
409f1ceaac6SMatthew G. Knepley   PetscScalar       *y,sone = 1.0;
410da3a660dSBarry Smith   Vec               tmp = 0;
411c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
41267e560aaSBarry Smith 
4133a40ed3dSBarry Smith   PetscFunctionBegin;
414c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
415f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
4161ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
417d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
418da3a660dSBarry Smith   if (yy == zz) {
41978b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
4203bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
42178b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
422da3a660dSBarry Smith   }
423d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
424752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
425da3a660dSBarry Smith   if (mat->pivots) {
426ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
427e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
428ae7cfcebSSatish Balay #else
4298b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
430e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
431ae7cfcebSSatish Balay #endif
432a8c6a408SBarry Smith   } else {
433ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
434e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
435ae7cfcebSSatish Balay #else
4368b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
437e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
438ae7cfcebSSatish Balay #endif
439da3a660dSBarry Smith   }
4406bf464f9SBarry Smith   if (tmp) {
4416bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
4426bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4436bf464f9SBarry Smith   } else {
4446bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
4456bf464f9SBarry Smith   }
446f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
4471ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
448dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
4493a40ed3dSBarry Smith   PetscFunctionReturn(0);
450da3a660dSBarry Smith }
45167e560aaSBarry Smith 
4524a2ae208SSatish Balay #undef __FUNCT__
4534a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
454*e0877f53SBarry Smith static PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
455da3a660dSBarry Smith {
456c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
4576849ba73SBarry Smith   PetscErrorCode    ierr;
458f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
459f1ceaac6SMatthew G. Knepley   PetscScalar       *y,sone = 1.0;
460da3a660dSBarry Smith   Vec               tmp;
461c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
46267e560aaSBarry Smith 
4633a40ed3dSBarry Smith   PetscFunctionBegin;
464c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
465d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
466f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
4671ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
468da3a660dSBarry Smith   if (yy == zz) {
46978b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
4703bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
47178b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
472da3a660dSBarry Smith   }
473d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
474752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
475da3a660dSBarry Smith   if (mat->pivots) {
476ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
477e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
478ae7cfcebSSatish Balay #else
4798b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
480e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
481ae7cfcebSSatish Balay #endif
4823a40ed3dSBarry Smith   } else {
483ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
484e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
485ae7cfcebSSatish Balay #else
4868b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
487e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
488ae7cfcebSSatish Balay #endif
489da3a660dSBarry Smith   }
49090f02eecSBarry Smith   if (tmp) {
4912dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
4926bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4933a40ed3dSBarry Smith   } else {
4942dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
49590f02eecSBarry Smith   }
496f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
4971ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
498dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
4993a40ed3dSBarry Smith   PetscFunctionReturn(0);
500da3a660dSBarry Smith }
501db4efbfdSBarry Smith 
502db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
503db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
504db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
505db4efbfdSBarry Smith #undef __FUNCT__
506db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
507*e0877f53SBarry Smith static PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
508db4efbfdSBarry Smith {
509db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
510db4efbfdSBarry Smith   PetscFunctionBegin;
511e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
512db4efbfdSBarry Smith #else
513db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
514db4efbfdSBarry Smith   PetscErrorCode ierr;
515db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
516db4efbfdSBarry Smith 
517db4efbfdSBarry Smith   PetscFunctionBegin;
518c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
519c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
520db4efbfdSBarry Smith   if (!mat->pivots) {
521854ce69bSBarry Smith     ierr = PetscMalloc1(A->rmap->n+1,&mat->pivots);CHKERRQ(ierr);
5223bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
523db4efbfdSBarry Smith   }
524db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5258e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
5268b83055fSJed Brown   PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info));
5278e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
5288e57ea43SSatish Balay 
529e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
530e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
531db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
532db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
533db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
534db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
535d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
536db4efbfdSBarry Smith 
537dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
538db4efbfdSBarry Smith #endif
539db4efbfdSBarry Smith   PetscFunctionReturn(0);
540db4efbfdSBarry Smith }
541db4efbfdSBarry Smith 
542db4efbfdSBarry Smith #undef __FUNCT__
543db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
544*e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
545db4efbfdSBarry Smith {
546db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
547db4efbfdSBarry Smith   PetscFunctionBegin;
548e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
549db4efbfdSBarry Smith #else
550db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
551db4efbfdSBarry Smith   PetscErrorCode ierr;
552c5df96a5SBarry Smith   PetscBLASInt   info,n;
553db4efbfdSBarry Smith 
554db4efbfdSBarry Smith   PetscFunctionBegin;
555c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
556db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
557db4efbfdSBarry Smith 
558db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5598b83055fSJed Brown   PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
560e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
561db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
562db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
563db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
564db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
565d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
5662205254eSKarl Rupp 
567eb3f19e4SBarry Smith   ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
568db4efbfdSBarry Smith #endif
569db4efbfdSBarry Smith   PetscFunctionReturn(0);
570db4efbfdSBarry Smith }
571db4efbfdSBarry Smith 
572db4efbfdSBarry Smith 
573db4efbfdSBarry Smith #undef __FUNCT__
574db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
5750481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
576db4efbfdSBarry Smith {
577db4efbfdSBarry Smith   PetscErrorCode ierr;
578db4efbfdSBarry Smith   MatFactorInfo  info;
579db4efbfdSBarry Smith 
580db4efbfdSBarry Smith   PetscFunctionBegin;
581db4efbfdSBarry Smith   info.fill = 1.0;
5822205254eSKarl Rupp 
583c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
584719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
585db4efbfdSBarry Smith   PetscFunctionReturn(0);
586db4efbfdSBarry Smith }
587db4efbfdSBarry Smith 
588db4efbfdSBarry Smith #undef __FUNCT__
589db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
590*e0877f53SBarry Smith static PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
591db4efbfdSBarry Smith {
592db4efbfdSBarry Smith   PetscFunctionBegin;
593c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
5941bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
595719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
596db4efbfdSBarry Smith   PetscFunctionReturn(0);
597db4efbfdSBarry Smith }
598db4efbfdSBarry Smith 
599db4efbfdSBarry Smith #undef __FUNCT__
600db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
601*e0877f53SBarry Smith static PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
602db4efbfdSBarry Smith {
603db4efbfdSBarry Smith   PetscFunctionBegin;
604b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
605c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
606719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
607db4efbfdSBarry Smith   PetscFunctionReturn(0);
608db4efbfdSBarry Smith }
609db4efbfdSBarry Smith 
610db4efbfdSBarry Smith #undef __FUNCT__
611db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
6128cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
613db4efbfdSBarry Smith {
614db4efbfdSBarry Smith   PetscErrorCode ierr;
615db4efbfdSBarry Smith 
616db4efbfdSBarry Smith   PetscFunctionBegin;
617ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr);
618db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
619db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
620db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU) {
621db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
622db4efbfdSBarry Smith   } else {
623db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
624db4efbfdSBarry Smith   }
625d5f3da31SBarry Smith   (*fact)->factortype = ftype;
626db4efbfdSBarry Smith   PetscFunctionReturn(0);
627db4efbfdSBarry Smith }
628db4efbfdSBarry Smith 
629289bc588SBarry Smith /* ------------------------------------------------------------------*/
6304a2ae208SSatish Balay #undef __FUNCT__
63141f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
632*e0877f53SBarry Smith static PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
633289bc588SBarry Smith {
634c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
635d9ca1df4SBarry Smith   PetscScalar       *x,*v = mat->v,zero = 0.0,xt;
636d9ca1df4SBarry Smith   const PetscScalar *b;
637dfbe8321SBarry Smith   PetscErrorCode    ierr;
638d0f46423SBarry Smith   PetscInt          m = A->rmap->n,i;
639c5df96a5SBarry Smith   PetscBLASInt      o = 1,bm;
640289bc588SBarry Smith 
6413a40ed3dSBarry Smith   PetscFunctionBegin;
642422a814eSBarry Smith   if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */
643c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
644289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
64571044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
6462dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
647289bc588SBarry Smith   }
6481ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
649d9ca1df4SBarry Smith   ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr);
650b965ef7fSBarry Smith   its  = its*lits;
651e32f2f54SBarry Smith   if (its <= 0) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Relaxation requires global its %D and local its %D both positive",its,lits);
652289bc588SBarry Smith   while (its--) {
653fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
654289bc588SBarry Smith       for (i=0; i<m; i++) {
6558b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
65655a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
657289bc588SBarry Smith       }
658289bc588SBarry Smith     }
659fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
660289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
6618b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
66255a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
663289bc588SBarry Smith       }
664289bc588SBarry Smith     }
665289bc588SBarry Smith   }
666d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr);
6671ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6683a40ed3dSBarry Smith   PetscFunctionReturn(0);
669289bc588SBarry Smith }
670289bc588SBarry Smith 
671289bc588SBarry Smith /* -----------------------------------------------------------------*/
6724a2ae208SSatish Balay #undef __FUNCT__
6734a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
674*e0877f53SBarry Smith static PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
675289bc588SBarry Smith {
676c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
677d9ca1df4SBarry Smith   const PetscScalar *v   = mat->v,*x;
678d9ca1df4SBarry Smith   PetscScalar       *y;
679dfbe8321SBarry Smith   PetscErrorCode    ierr;
6800805154bSBarry Smith   PetscBLASInt      m, n,_One=1;
681ea709b57SSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
6823a40ed3dSBarry Smith 
6833a40ed3dSBarry Smith   PetscFunctionBegin;
684c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
685c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
686d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
687d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6881ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6898b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
690d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6911ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
692dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
6933a40ed3dSBarry Smith   PetscFunctionReturn(0);
694289bc588SBarry Smith }
695800995b7SMatthew Knepley 
6964a2ae208SSatish Balay #undef __FUNCT__
6974a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
698*e0877f53SBarry Smith static PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
699289bc588SBarry Smith {
700c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
701d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0,_DZero=0.0;
702dfbe8321SBarry Smith   PetscErrorCode    ierr;
7030805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
704d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
7053a40ed3dSBarry Smith 
7063a40ed3dSBarry Smith   PetscFunctionBegin;
707c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
708c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
709d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
710d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7111ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7128b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
713d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7141ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
715dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
7163a40ed3dSBarry Smith   PetscFunctionReturn(0);
717289bc588SBarry Smith }
7186ee01492SSatish Balay 
7194a2ae208SSatish Balay #undef __FUNCT__
7204a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
721*e0877f53SBarry Smith static PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
722289bc588SBarry Smith {
723c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
724d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
725d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0;
726dfbe8321SBarry Smith   PetscErrorCode    ierr;
7270805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
7283a40ed3dSBarry Smith 
7293a40ed3dSBarry Smith   PetscFunctionBegin;
730c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
731c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
732d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
733600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
734d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7351ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7368b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
737d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7381ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
739dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
7403a40ed3dSBarry Smith   PetscFunctionReturn(0);
741289bc588SBarry Smith }
7426ee01492SSatish Balay 
7434a2ae208SSatish Balay #undef __FUNCT__
7444a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
745*e0877f53SBarry Smith static PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
746289bc588SBarry Smith {
747c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
748d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
749d9ca1df4SBarry Smith   PetscScalar       *y;
750dfbe8321SBarry Smith   PetscErrorCode    ierr;
7510805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
75287828ca2SBarry Smith   PetscScalar       _DOne=1.0;
7533a40ed3dSBarry Smith 
7543a40ed3dSBarry Smith   PetscFunctionBegin;
755c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
756c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
757d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
758600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
759d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7601ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7618b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
762d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7631ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
764dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
7653a40ed3dSBarry Smith   PetscFunctionReturn(0);
766289bc588SBarry Smith }
767289bc588SBarry Smith 
768289bc588SBarry Smith /* -----------------------------------------------------------------*/
7694a2ae208SSatish Balay #undef __FUNCT__
7704a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
771*e0877f53SBarry Smith static PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
772289bc588SBarry Smith {
773c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
77487828ca2SBarry Smith   PetscScalar    *v;
7756849ba73SBarry Smith   PetscErrorCode ierr;
77613f74950SBarry Smith   PetscInt       i;
77767e560aaSBarry Smith 
7783a40ed3dSBarry Smith   PetscFunctionBegin;
779d0f46423SBarry Smith   *ncols = A->cmap->n;
780289bc588SBarry Smith   if (cols) {
781854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr);
782d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
783289bc588SBarry Smith   }
784289bc588SBarry Smith   if (vals) {
785854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr);
786289bc588SBarry Smith     v    = mat->v + row;
787d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
788289bc588SBarry Smith   }
7893a40ed3dSBarry Smith   PetscFunctionReturn(0);
790289bc588SBarry Smith }
7916ee01492SSatish Balay 
7924a2ae208SSatish Balay #undef __FUNCT__
7934a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
794*e0877f53SBarry Smith static PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
795289bc588SBarry Smith {
796dfbe8321SBarry Smith   PetscErrorCode ierr;
7976e111a19SKarl Rupp 
798606d414cSSatish Balay   PetscFunctionBegin;
799606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
800606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
8013a40ed3dSBarry Smith   PetscFunctionReturn(0);
802289bc588SBarry Smith }
803289bc588SBarry Smith /* ----------------------------------------------------------------*/
8044a2ae208SSatish Balay #undef __FUNCT__
8054a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
806*e0877f53SBarry Smith static PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
807289bc588SBarry Smith {
808c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
80913f74950SBarry Smith   PetscInt     i,j,idx=0;
810d6dfbf8fSBarry Smith 
8113a40ed3dSBarry Smith   PetscFunctionBegin;
812289bc588SBarry Smith   if (!mat->roworiented) {
813dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
814289bc588SBarry Smith       for (j=0; j<n; j++) {
815cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
8162515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
817e32f2f54SBarry Smith         if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
81858804f6dSBarry Smith #endif
819289bc588SBarry Smith         for (i=0; i<m; i++) {
820cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
8212515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
822e32f2f54SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
82358804f6dSBarry Smith #endif
824cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
825289bc588SBarry Smith         }
826289bc588SBarry Smith       }
8273a40ed3dSBarry Smith     } else {
828289bc588SBarry Smith       for (j=0; j<n; j++) {
829cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
8302515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
831e32f2f54SBarry Smith         if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
83258804f6dSBarry Smith #endif
833289bc588SBarry Smith         for (i=0; i<m; i++) {
834cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
8352515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
836e32f2f54SBarry Smith           if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
83758804f6dSBarry Smith #endif
838cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
839289bc588SBarry Smith         }
840289bc588SBarry Smith       }
841289bc588SBarry Smith     }
8423a40ed3dSBarry Smith   } else {
843dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
844e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
845cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
8462515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
847e32f2f54SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
84858804f6dSBarry Smith #endif
849e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
850cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
8512515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
852e32f2f54SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
85358804f6dSBarry Smith #endif
854cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
855e8d4e0b9SBarry Smith         }
856e8d4e0b9SBarry Smith       }
8573a40ed3dSBarry Smith     } else {
858289bc588SBarry Smith       for (i=0; i<m; i++) {
859cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
8602515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
861e32f2f54SBarry Smith         if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row too large: row %D max %D",indexm[i],A->rmap->n-1);
86258804f6dSBarry Smith #endif
863289bc588SBarry Smith         for (j=0; j<n; j++) {
864cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
8652515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
866e32f2f54SBarry Smith           if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column too large: col %D max %D",indexn[j],A->cmap->n-1);
86758804f6dSBarry Smith #endif
868cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
869289bc588SBarry Smith         }
870289bc588SBarry Smith       }
871289bc588SBarry Smith     }
872e8d4e0b9SBarry Smith   }
8733a40ed3dSBarry Smith   PetscFunctionReturn(0);
874289bc588SBarry Smith }
875e8d4e0b9SBarry Smith 
8764a2ae208SSatish Balay #undef __FUNCT__
8774a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
878*e0877f53SBarry Smith static PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
879ae80bb75SLois Curfman McInnes {
880ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
88113f74950SBarry Smith   PetscInt     i,j;
882ae80bb75SLois Curfman McInnes 
8833a40ed3dSBarry Smith   PetscFunctionBegin;
884ae80bb75SLois Curfman McInnes   /* row-oriented output */
885ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
88697e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
887e32f2f54SBarry Smith     if (indexm[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested larger than number rows %D",indexm[i],A->rmap->n);
888ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
8896f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
890e32f2f54SBarry Smith       if (indexn[j] >= A->cmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Column %D requested larger than number columns %D",indexn[j],A->cmap->n);
89197e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
892ae80bb75SLois Curfman McInnes     }
893ae80bb75SLois Curfman McInnes   }
8943a40ed3dSBarry Smith   PetscFunctionReturn(0);
895ae80bb75SLois Curfman McInnes }
896ae80bb75SLois Curfman McInnes 
897289bc588SBarry Smith /* -----------------------------------------------------------------*/
898289bc588SBarry Smith 
8994a2ae208SSatish Balay #undef __FUNCT__
9005bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
901*e0877f53SBarry Smith static PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
902aabbc4fbSShri Abhyankar {
903aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
904aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
905aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
906aabbc4fbSShri Abhyankar   int            fd;
907aabbc4fbSShri Abhyankar   PetscMPIInt    size;
908aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
909aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
910ce94432eSBarry Smith   MPI_Comm       comm;
911aabbc4fbSShri Abhyankar 
912aabbc4fbSShri Abhyankar   PetscFunctionBegin;
913c98fd787SBarry Smith   /* force binary viewer to load .info file if it has not yet done so */
914c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
915ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
916aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
917aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
918aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
919aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
920aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
921aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
922aabbc4fbSShri Abhyankar 
923aabbc4fbSShri Abhyankar   /* set global size if not set already*/
924aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
925aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
926aabbc4fbSShri Abhyankar   } else {
927aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
928aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
929aabbc4fbSShri Abhyankar     if (M != grows ||  N != gcols) SETERRQ4(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED, "Matrix in file of different length (%d, %d) than the input matrix (%d, %d)",M,N,grows,gcols);
930aabbc4fbSShri Abhyankar   }
931e6324fbbSBarry Smith   a = (Mat_SeqDense*)newmat->data;
932e6324fbbSBarry Smith   if (!a->user_alloc) {
9330298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
934e6324fbbSBarry Smith   }
935aabbc4fbSShri Abhyankar 
936aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
937aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
938aabbc4fbSShri Abhyankar     v = a->v;
939aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
940aabbc4fbSShri Abhyankar        from row major to column major */
941854ce69bSBarry Smith     ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr);
942aabbc4fbSShri Abhyankar     /* read in nonzero values */
943aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
944aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
945aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
946aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
947aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
948aabbc4fbSShri Abhyankar       }
949aabbc4fbSShri Abhyankar     }
950aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
951aabbc4fbSShri Abhyankar   } else {
952aabbc4fbSShri Abhyankar     /* read row lengths */
953854ce69bSBarry Smith     ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr);
954aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
955aabbc4fbSShri Abhyankar 
956aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
957aabbc4fbSShri Abhyankar     v = a->v;
958aabbc4fbSShri Abhyankar 
959aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
960854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr);
961aabbc4fbSShri Abhyankar     cols = scols;
962aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
963854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr);
964aabbc4fbSShri Abhyankar     vals = svals;
965aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
966aabbc4fbSShri Abhyankar 
967aabbc4fbSShri Abhyankar     /* insert into matrix */
968aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
969aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
970aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
971aabbc4fbSShri Abhyankar     }
972aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
973aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
974aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
975aabbc4fbSShri Abhyankar   }
976aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
977aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
978aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
979aabbc4fbSShri Abhyankar }
980aabbc4fbSShri Abhyankar 
981aabbc4fbSShri Abhyankar #undef __FUNCT__
9824a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
9836849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
984289bc588SBarry Smith {
985932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
986dfbe8321SBarry Smith   PetscErrorCode    ierr;
98713f74950SBarry Smith   PetscInt          i,j;
9882dcb1b2aSMatthew Knepley   const char        *name;
98987828ca2SBarry Smith   PetscScalar       *v;
990f3ef73ceSBarry Smith   PetscViewerFormat format;
9915f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
992ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
9935f481a85SSatish Balay #endif
994932b0c3eSLois Curfman McInnes 
9953a40ed3dSBarry Smith   PetscFunctionBegin;
996b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
997456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
9983a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
999fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
1000d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1001d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
100244cd7ae7SLois Curfman McInnes       v    = a->v + i;
100377431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
1004d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1005aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1006329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
100757622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
1008329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
100957622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr);
10106831982aSBarry Smith         }
101180cd9d93SLois Curfman McInnes #else
10126831982aSBarry Smith         if (*v) {
101357622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr);
10146831982aSBarry Smith         }
101580cd9d93SLois Curfman McInnes #endif
10161b807ce4Svictorle         v += a->lda;
101780cd9d93SLois Curfman McInnes       }
1018b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
101980cd9d93SLois Curfman McInnes     }
1020d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
10213a40ed3dSBarry Smith   } else {
1022d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1023aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
102447989497SBarry Smith     /* determine if matrix has all real values */
102547989497SBarry Smith     v = a->v;
1026d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
1027ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
102847989497SBarry Smith     }
102947989497SBarry Smith #endif
1030fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
10313a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
1032d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1033d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1034fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
1035ffac6cdbSBarry Smith     }
1036ffac6cdbSBarry Smith 
1037d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
1038932b0c3eSLois Curfman McInnes       v = a->v + i;
1039d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1040aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
104147989497SBarry Smith         if (allreal) {
1042c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
104347989497SBarry Smith         } else {
1044c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
104547989497SBarry Smith         }
1046289bc588SBarry Smith #else
1047c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
1048289bc588SBarry Smith #endif
10491b807ce4Svictorle         v += a->lda;
1050289bc588SBarry Smith       }
1051b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
1052289bc588SBarry Smith     }
1053fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
1054b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
1055ffac6cdbSBarry Smith     }
1056d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
1057da3a660dSBarry Smith   }
1058b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
10593a40ed3dSBarry Smith   PetscFunctionReturn(0);
1060289bc588SBarry Smith }
1061289bc588SBarry Smith 
10624a2ae208SSatish Balay #undef __FUNCT__
10634a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
10646849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
1065932b0c3eSLois Curfman McInnes {
1066932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10676849ba73SBarry Smith   PetscErrorCode    ierr;
106813f74950SBarry Smith   int               fd;
1069d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
1070f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
1071f4403165SShri Abhyankar   PetscViewerFormat format;
1072932b0c3eSLois Curfman McInnes 
10733a40ed3dSBarry Smith   PetscFunctionBegin;
1074b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
107590ace30eSBarry Smith 
1076f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1077f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
1078f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
1079785e854fSJed Brown     ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr);
10802205254eSKarl Rupp 
1081f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
1082f4403165SShri Abhyankar     col_lens[1] = m;
1083f4403165SShri Abhyankar     col_lens[2] = n;
1084f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
10852205254eSKarl Rupp 
1086f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1087f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1088f4403165SShri Abhyankar 
1089f4403165SShri Abhyankar     /* write out matrix, by rows */
1090854ce69bSBarry Smith     ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr);
1091f4403165SShri Abhyankar     v    = a->v;
1092f4403165SShri Abhyankar     for (j=0; j<n; j++) {
1093f4403165SShri Abhyankar       for (i=0; i<m; i++) {
1094f4403165SShri Abhyankar         vals[j + i*n] = *v++;
1095f4403165SShri Abhyankar       }
1096f4403165SShri Abhyankar     }
1097f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1098f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1099f4403165SShri Abhyankar   } else {
1100854ce69bSBarry Smith     ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr);
11012205254eSKarl Rupp 
11020700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
1103932b0c3eSLois Curfman McInnes     col_lens[1] = m;
1104932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1105932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1106932b0c3eSLois Curfman McInnes 
1107932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1108932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
11096f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1110932b0c3eSLois Curfman McInnes 
1111932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1112932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1113932b0c3eSLois Curfman McInnes     ict = 0;
1114932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1115932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1116932b0c3eSLois Curfman McInnes     }
11176f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1118606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1119932b0c3eSLois Curfman McInnes 
1120932b0c3eSLois Curfman McInnes     /* store nonzero values */
1121854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr);
1122932b0c3eSLois Curfman McInnes     ict  = 0;
1123932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1124932b0c3eSLois Curfman McInnes       v = a->v + i;
1125932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
11261b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1127932b0c3eSLois Curfman McInnes       }
1128932b0c3eSLois Curfman McInnes     }
11296f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1130606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1131f4403165SShri Abhyankar   }
11323a40ed3dSBarry Smith   PetscFunctionReturn(0);
1133932b0c3eSLois Curfman McInnes }
1134932b0c3eSLois Curfman McInnes 
11359804daf3SBarry Smith #include <petscdraw.h>
11364a2ae208SSatish Balay #undef __FUNCT__
11374a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1138*e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1139f1af5d2fSBarry Smith {
1140f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
1141f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
11426849ba73SBarry Smith   PetscErrorCode    ierr;
1143d0f46423SBarry Smith   PetscInt          m  = A->rmap->n,n = A->cmap->n,color,i,j;
114487828ca2SBarry Smith   PetscScalar       *v = a->v;
1145b0a32e0cSBarry Smith   PetscViewer       viewer;
1146b05fc000SLisandro Dalcin   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r;
1147f3ef73ceSBarry Smith   PetscViewerFormat format;
1148f1af5d2fSBarry Smith 
1149f1af5d2fSBarry Smith   PetscFunctionBegin;
1150f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1151b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1152b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1153f1af5d2fSBarry Smith 
1154f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1155fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1156f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1157b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1158f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1159f1af5d2fSBarry Smith       x_l = j;
1160f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1161f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1162f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1163f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1164329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1165b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1166329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1167b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1168f1af5d2fSBarry Smith         } else {
1169f1af5d2fSBarry Smith           continue;
1170f1af5d2fSBarry Smith         }
1171b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1172f1af5d2fSBarry Smith       }
1173f1af5d2fSBarry Smith     }
1174f1af5d2fSBarry Smith   } else {
1175f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1176f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1177b05fc000SLisandro Dalcin     PetscReal minv = 0.0, maxv = 0.0;
1178b05fc000SLisandro Dalcin     PetscDraw popup;
1179b05fc000SLisandro Dalcin 
1180f1af5d2fSBarry Smith     for (i = 0; i < m*n; i++) {
1181f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1182f1af5d2fSBarry Smith     }
1183b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1184b05fc000SLisandro Dalcin     if (popup) {ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr);}
1185f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1186f1af5d2fSBarry Smith       x_l = j;
1187f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1188f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1189f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1190f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1191b05fc000SLisandro Dalcin         color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv);
1192b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1193f1af5d2fSBarry Smith       }
1194f1af5d2fSBarry Smith     }
1195f1af5d2fSBarry Smith   }
1196f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1197f1af5d2fSBarry Smith }
1198f1af5d2fSBarry Smith 
11994a2ae208SSatish Balay #undef __FUNCT__
12004a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1201*e0877f53SBarry Smith static PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1202f1af5d2fSBarry Smith {
1203b0a32e0cSBarry Smith   PetscDraw      draw;
1204ace3abfcSBarry Smith   PetscBool      isnull;
1205329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1206dfbe8321SBarry Smith   PetscErrorCode ierr;
1207f1af5d2fSBarry Smith 
1208f1af5d2fSBarry Smith   PetscFunctionBegin;
1209b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1210b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1211abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1212f1af5d2fSBarry Smith 
1213f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1214d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1215f1af5d2fSBarry Smith   xr  += w;    yr += h;  xl = -w;     yl = -h;
1216b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1217b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
12180298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1219f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1220f1af5d2fSBarry Smith }
1221f1af5d2fSBarry Smith 
12224a2ae208SSatish Balay #undef __FUNCT__
12234a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1224dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1225932b0c3eSLois Curfman McInnes {
1226dfbe8321SBarry Smith   PetscErrorCode ierr;
1227ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1228932b0c3eSLois Curfman McInnes 
12293a40ed3dSBarry Smith   PetscFunctionBegin;
1230251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1231251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1232251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
12330f5bd95cSBarry Smith 
1234c45a1595SBarry Smith   if (iascii) {
1235c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
12360f5bd95cSBarry Smith   } else if (isbinary) {
12373a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1238f1af5d2fSBarry Smith   } else if (isdraw) {
1239f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1240932b0c3eSLois Curfman McInnes   }
12413a40ed3dSBarry Smith   PetscFunctionReturn(0);
1242932b0c3eSLois Curfman McInnes }
1243289bc588SBarry Smith 
12444a2ae208SSatish Balay #undef __FUNCT__
12454a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1246*e0877f53SBarry Smith static PetscErrorCode MatDestroy_SeqDense(Mat mat)
1247289bc588SBarry Smith {
1248ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1249dfbe8321SBarry Smith   PetscErrorCode ierr;
125090f02eecSBarry Smith 
12513a40ed3dSBarry Smith   PetscFunctionBegin;
1252aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1253d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1254a5a9c739SBarry Smith #endif
125505b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
1256abc3b08eSStefano Zampini   ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr);
12576857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1258bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1259dbd8c25aSHong Zhang 
1260dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1261bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
1262bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
12638baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr);
12648baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
12658baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr);
12668baccfbdSHong Zhang #endif
1267bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
1268bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1269bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1270bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1271abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12723bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12733bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12743bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12753a40ed3dSBarry Smith   PetscFunctionReturn(0);
1276289bc588SBarry Smith }
1277289bc588SBarry Smith 
12784a2ae208SSatish Balay #undef __FUNCT__
12794a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1280*e0877f53SBarry Smith static PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1281289bc588SBarry Smith {
1282c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
12836849ba73SBarry Smith   PetscErrorCode ierr;
128413f74950SBarry Smith   PetscInt       k,j,m,n,M;
128587828ca2SBarry Smith   PetscScalar    *v,tmp;
128648b35521SBarry Smith 
12873a40ed3dSBarry Smith   PetscFunctionBegin;
1288d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1289e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1290e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1291e7e72b3dSBarry Smith     else {
1292d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1293289bc588SBarry Smith         for (k=0; k<j; k++) {
12941b807ce4Svictorle           tmp        = v[j + k*M];
12951b807ce4Svictorle           v[j + k*M] = v[k + j*M];
12961b807ce4Svictorle           v[k + j*M] = tmp;
1297289bc588SBarry Smith         }
1298289bc588SBarry Smith       }
1299d64ed03dSBarry Smith     }
13003a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1301d3e5ee88SLois Curfman McInnes     Mat          tmat;
1302ec8511deSBarry Smith     Mat_SeqDense *tmatd;
130387828ca2SBarry Smith     PetscScalar  *v2;
1304af36a384SStefano Zampini     PetscInt     M2;
1305ea709b57SSatish Balay 
1306fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
1307ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1308d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
13097adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
13100298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1311fc4dec0aSBarry Smith     } else {
1312fc4dec0aSBarry Smith       tmat = *matout;
1313fc4dec0aSBarry Smith     }
1314ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
1315af36a384SStefano Zampini     v = mat->v; v2 = tmatd->v; M2 = tmatd->lda;
1316d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
1317af36a384SStefano Zampini       for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M];
1318d3e5ee88SLois Curfman McInnes     }
13196d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
13206d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1321d3e5ee88SLois Curfman McInnes     *matout = tmat;
132248b35521SBarry Smith   }
13233a40ed3dSBarry Smith   PetscFunctionReturn(0);
1324289bc588SBarry Smith }
1325289bc588SBarry Smith 
13264a2ae208SSatish Balay #undef __FUNCT__
13274a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1328*e0877f53SBarry Smith static PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1329289bc588SBarry Smith {
1330c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1331c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
133213f74950SBarry Smith   PetscInt     i,j;
1333a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
13349ea5d5aeSSatish Balay 
13353a40ed3dSBarry Smith   PetscFunctionBegin;
1336d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1337d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1338d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
13391b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1340d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
13413a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
13421b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
13431b807ce4Svictorle     }
1344289bc588SBarry Smith   }
134577c4ece6SBarry Smith   *flg = PETSC_TRUE;
13463a40ed3dSBarry Smith   PetscFunctionReturn(0);
1347289bc588SBarry Smith }
1348289bc588SBarry Smith 
13494a2ae208SSatish Balay #undef __FUNCT__
13504a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1351*e0877f53SBarry Smith static PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1352289bc588SBarry Smith {
1353c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1354dfbe8321SBarry Smith   PetscErrorCode ierr;
135513f74950SBarry Smith   PetscInt       i,n,len;
135687828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
135744cd7ae7SLois Curfman McInnes 
13583a40ed3dSBarry Smith   PetscFunctionBegin;
13592dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
13607a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
13611ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1362d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1363e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
136444cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
13651b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1366289bc588SBarry Smith   }
13671ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
13683a40ed3dSBarry Smith   PetscFunctionReturn(0);
1369289bc588SBarry Smith }
1370289bc588SBarry Smith 
13714a2ae208SSatish Balay #undef __FUNCT__
13724a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1373*e0877f53SBarry Smith static PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1374289bc588SBarry Smith {
1375c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1376f1ceaac6SMatthew G. Knepley   const PetscScalar *l,*r;
1377f1ceaac6SMatthew G. Knepley   PetscScalar       x,*v;
1378dfbe8321SBarry Smith   PetscErrorCode    ierr;
1379d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n;
138055659b69SBarry Smith 
13813a40ed3dSBarry Smith   PetscFunctionBegin;
138228988994SBarry Smith   if (ll) {
13837a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
1384f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr);
1385e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1386da3a660dSBarry Smith     for (i=0; i<m; i++) {
1387da3a660dSBarry Smith       x = l[i];
1388da3a660dSBarry Smith       v = mat->v + i;
1389b43bac26SStefano Zampini       for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;}
1390da3a660dSBarry Smith     }
1391f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr);
1392eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1393da3a660dSBarry Smith   }
139428988994SBarry Smith   if (rr) {
13957a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
1396f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr);
1397e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1398da3a660dSBarry Smith     for (i=0; i<n; i++) {
1399da3a660dSBarry Smith       x = r[i];
1400b43bac26SStefano Zampini       v = mat->v + i*mat->lda;
14012205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1402da3a660dSBarry Smith     }
1403f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr);
1404eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1405da3a660dSBarry Smith   }
14063a40ed3dSBarry Smith   PetscFunctionReturn(0);
1407289bc588SBarry Smith }
1408289bc588SBarry Smith 
14094a2ae208SSatish Balay #undef __FUNCT__
14104a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1411*e0877f53SBarry Smith static PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1412289bc588SBarry Smith {
1413c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
141487828ca2SBarry Smith   PetscScalar    *v   = mat->v;
1415329f5518SBarry Smith   PetscReal      sum  = 0.0;
1416d0f46423SBarry Smith   PetscInt       lda  =mat->lda,m=A->rmap->n,i,j;
1417efee365bSSatish Balay   PetscErrorCode ierr;
141855659b69SBarry Smith 
14193a40ed3dSBarry Smith   PetscFunctionBegin;
1420289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1421a5ce6ee0Svictorle     if (lda>m) {
1422d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1423a5ce6ee0Svictorle         v = mat->v+j*lda;
1424a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1425a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1426a5ce6ee0Svictorle         }
1427a5ce6ee0Svictorle       }
1428a5ce6ee0Svictorle     } else {
1429d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1430329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1431289bc588SBarry Smith       }
1432a5ce6ee0Svictorle     }
14338f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1434dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
14353a40ed3dSBarry Smith   } else if (type == NORM_1) {
1436064f8208SBarry Smith     *nrm = 0.0;
1437d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
14381b807ce4Svictorle       v   = mat->v + j*mat->lda;
1439289bc588SBarry Smith       sum = 0.0;
1440d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
144133a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1442289bc588SBarry Smith       }
1443064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1444289bc588SBarry Smith     }
1445eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
14463a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1447064f8208SBarry Smith     *nrm = 0.0;
1448d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1449289bc588SBarry Smith       v   = mat->v + j;
1450289bc588SBarry Smith       sum = 0.0;
1451d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
14521b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1453289bc588SBarry Smith       }
1454064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1455289bc588SBarry Smith     }
1456eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1457e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
14583a40ed3dSBarry Smith   PetscFunctionReturn(0);
1459289bc588SBarry Smith }
1460289bc588SBarry Smith 
14614a2ae208SSatish Balay #undef __FUNCT__
14624a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1463*e0877f53SBarry Smith static PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1464289bc588SBarry Smith {
1465c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
146663ba0a88SBarry Smith   PetscErrorCode ierr;
146767e560aaSBarry Smith 
14683a40ed3dSBarry Smith   PetscFunctionBegin;
1469b5a2b587SKris Buschelman   switch (op) {
1470b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
14714e0d8c25SBarry Smith     aij->roworiented = flg;
1472b5a2b587SKris Buschelman     break;
1473512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1474b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
14753971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
14764e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
147713fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1478b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1479b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
14805021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
14815021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
14825021d80fSJed Brown     break;
14835021d80fSJed Brown   case MAT_SPD:
148477e54ba9SKris Buschelman   case MAT_SYMMETRIC:
148577e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
14869a4540c5SBarry Smith   case MAT_HERMITIAN:
14879a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
14885021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
148977e54ba9SKris Buschelman     break;
1490b5a2b587SKris Buschelman   default:
1491e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
14923a40ed3dSBarry Smith   }
14933a40ed3dSBarry Smith   PetscFunctionReturn(0);
1494289bc588SBarry Smith }
1495289bc588SBarry Smith 
14964a2ae208SSatish Balay #undef __FUNCT__
14974a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1498*e0877f53SBarry Smith static PetscErrorCode MatZeroEntries_SeqDense(Mat A)
14996f0a148fSBarry Smith {
1500ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
15016849ba73SBarry Smith   PetscErrorCode ierr;
1502d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
15033a40ed3dSBarry Smith 
15043a40ed3dSBarry Smith   PetscFunctionBegin;
1505a5ce6ee0Svictorle   if (lda>m) {
1506d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1507a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1508a5ce6ee0Svictorle     }
1509a5ce6ee0Svictorle   } else {
1510d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1511a5ce6ee0Svictorle   }
15123a40ed3dSBarry Smith   PetscFunctionReturn(0);
15136f0a148fSBarry Smith }
15146f0a148fSBarry Smith 
15154a2ae208SSatish Balay #undef __FUNCT__
15164a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
1517*e0877f53SBarry Smith static PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
15186f0a148fSBarry Smith {
151997b48c8fSBarry Smith   PetscErrorCode    ierr;
1520ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1521b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
152297b48c8fSBarry Smith   PetscScalar       *slot,*bb;
152397b48c8fSBarry Smith   const PetscScalar *xx;
152455659b69SBarry Smith 
15253a40ed3dSBarry Smith   PetscFunctionBegin;
1526b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1527b9679d65SBarry Smith   for (i=0; i<N; i++) {
1528b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1529b9679d65SBarry Smith     if (rows[i] >= A->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Row %D requested to be zeroed greater than or equal number of rows %D",rows[i],A->rmap->n);
1530b9679d65SBarry Smith   }
1531b9679d65SBarry Smith #endif
1532b9679d65SBarry Smith 
153397b48c8fSBarry Smith   /* fix right hand side if needed */
153497b48c8fSBarry Smith   if (x && b) {
153597b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
153697b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
15372205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
153897b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
153997b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
154097b48c8fSBarry Smith   }
154197b48c8fSBarry Smith 
15426f0a148fSBarry Smith   for (i=0; i<N; i++) {
15436f0a148fSBarry Smith     slot = l->v + rows[i];
1544b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
15456f0a148fSBarry Smith   }
1546f4df32b1SMatthew Knepley   if (diag != 0.0) {
1547b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
15486f0a148fSBarry Smith     for (i=0; i<N; i++) {
1549b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1550f4df32b1SMatthew Knepley       *slot = diag;
15516f0a148fSBarry Smith     }
15526f0a148fSBarry Smith   }
15533a40ed3dSBarry Smith   PetscFunctionReturn(0);
15546f0a148fSBarry Smith }
1555557bce09SLois Curfman McInnes 
15564a2ae208SSatish Balay #undef __FUNCT__
15578c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
1558*e0877f53SBarry Smith static PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
155964e87e97SBarry Smith {
1560c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
15613a40ed3dSBarry Smith 
15623a40ed3dSBarry Smith   PetscFunctionBegin;
1563e32f2f54SBarry Smith   if (mat->lda != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Cannot get array for Dense matrices with LDA different from number of rows");
156464e87e97SBarry Smith   *array = mat->v;
15653a40ed3dSBarry Smith   PetscFunctionReturn(0);
156664e87e97SBarry Smith }
15670754003eSLois Curfman McInnes 
15684a2ae208SSatish Balay #undef __FUNCT__
15698c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
1570*e0877f53SBarry Smith static PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1571ff14e315SSatish Balay {
15723a40ed3dSBarry Smith   PetscFunctionBegin;
157309b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
15743a40ed3dSBarry Smith   PetscFunctionReturn(0);
1575ff14e315SSatish Balay }
15760754003eSLois Curfman McInnes 
15774a2ae208SSatish Balay #undef __FUNCT__
15788c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1579dec5eb66SMatthew G Knepley /*@C
15808c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
158173a71a0fSBarry Smith 
158273a71a0fSBarry Smith    Not Collective
158373a71a0fSBarry Smith 
158473a71a0fSBarry Smith    Input Parameter:
1585579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
158673a71a0fSBarry Smith 
158773a71a0fSBarry Smith    Output Parameter:
158873a71a0fSBarry Smith .   array - pointer to the data
158973a71a0fSBarry Smith 
159073a71a0fSBarry Smith    Level: intermediate
159173a71a0fSBarry Smith 
15928c778c55SBarry Smith .seealso: MatDenseRestoreArray()
159373a71a0fSBarry Smith @*/
15948c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
159573a71a0fSBarry Smith {
159673a71a0fSBarry Smith   PetscErrorCode ierr;
159773a71a0fSBarry Smith 
159873a71a0fSBarry Smith   PetscFunctionBegin;
15998c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
160073a71a0fSBarry Smith   PetscFunctionReturn(0);
160173a71a0fSBarry Smith }
160273a71a0fSBarry Smith 
160373a71a0fSBarry Smith #undef __FUNCT__
16048c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1605dec5eb66SMatthew G Knepley /*@C
1606579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
160773a71a0fSBarry Smith 
160873a71a0fSBarry Smith    Not Collective
160973a71a0fSBarry Smith 
161073a71a0fSBarry Smith    Input Parameters:
1611579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
161273a71a0fSBarry Smith .  array - pointer to the data
161373a71a0fSBarry Smith 
161473a71a0fSBarry Smith    Level: intermediate
161573a71a0fSBarry Smith 
16168c778c55SBarry Smith .seealso: MatDenseGetArray()
161773a71a0fSBarry Smith @*/
16188c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
161973a71a0fSBarry Smith {
162073a71a0fSBarry Smith   PetscErrorCode ierr;
162173a71a0fSBarry Smith 
162273a71a0fSBarry Smith   PetscFunctionBegin;
16238c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
162473a71a0fSBarry Smith   PetscFunctionReturn(0);
162573a71a0fSBarry Smith }
162673a71a0fSBarry Smith 
162773a71a0fSBarry Smith #undef __FUNCT__
16284a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
162913f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
16300754003eSLois Curfman McInnes {
1631c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
16326849ba73SBarry Smith   PetscErrorCode ierr;
16335d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
16345d0c19d7SBarry Smith   const PetscInt *irow,*icol;
163587828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
16360754003eSLois Curfman McInnes   Mat            newmat;
16370754003eSLois Curfman McInnes 
16383a40ed3dSBarry Smith   PetscFunctionBegin;
163978b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
164078b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1641e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1642e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
16430754003eSLois Curfman McInnes 
1644182d2002SSatish Balay   /* Check submatrixcall */
1645182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
164613f74950SBarry Smith     PetscInt n_cols,n_rows;
1647182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
164821a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1649f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1650c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
165121a2c019SBarry Smith     }
1652182d2002SSatish Balay     newmat = *B;
1653182d2002SSatish Balay   } else {
16540754003eSLois Curfman McInnes     /* Create and fill new matrix */
1655ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1656f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
16577adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
16580298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1659182d2002SSatish Balay   }
1660182d2002SSatish Balay 
1661182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1662182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1663182d2002SSatish Balay 
1664182d2002SSatish Balay   for (i=0; i<ncols; i++) {
16656de62eeeSBarry Smith     av = v + mat->lda*icol[i];
16662205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
16670754003eSLois Curfman McInnes   }
1668182d2002SSatish Balay 
1669182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
16706d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
16716d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
16720754003eSLois Curfman McInnes 
16730754003eSLois Curfman McInnes   /* Free work space */
167478b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
167578b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1676182d2002SSatish Balay   *B   = newmat;
16773a40ed3dSBarry Smith   PetscFunctionReturn(0);
16780754003eSLois Curfman McInnes }
16790754003eSLois Curfman McInnes 
16804a2ae208SSatish Balay #undef __FUNCT__
16814a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
1682*e0877f53SBarry Smith static PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1683905e6a2fSBarry Smith {
16846849ba73SBarry Smith   PetscErrorCode ierr;
168513f74950SBarry Smith   PetscInt       i;
1686905e6a2fSBarry Smith 
16873a40ed3dSBarry Smith   PetscFunctionBegin;
1688905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1689854ce69bSBarry Smith     ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr);
1690905e6a2fSBarry Smith   }
1691905e6a2fSBarry Smith 
1692905e6a2fSBarry Smith   for (i=0; i<n; i++) {
16936a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1694905e6a2fSBarry Smith   }
16953a40ed3dSBarry Smith   PetscFunctionReturn(0);
1696905e6a2fSBarry Smith }
1697905e6a2fSBarry Smith 
16984a2ae208SSatish Balay #undef __FUNCT__
1699c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1700*e0877f53SBarry Smith static PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1701c0aa2d19SHong Zhang {
1702c0aa2d19SHong Zhang   PetscFunctionBegin;
1703c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1704c0aa2d19SHong Zhang }
1705c0aa2d19SHong Zhang 
1706c0aa2d19SHong Zhang #undef __FUNCT__
1707c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1708*e0877f53SBarry Smith static PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1709c0aa2d19SHong Zhang {
1710c0aa2d19SHong Zhang   PetscFunctionBegin;
1711c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1712c0aa2d19SHong Zhang }
1713c0aa2d19SHong Zhang 
1714c0aa2d19SHong Zhang #undef __FUNCT__
17154a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1716*e0877f53SBarry Smith static PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
17174b0e389bSBarry Smith {
17184b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
17196849ba73SBarry Smith   PetscErrorCode ierr;
1720d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
17213a40ed3dSBarry Smith 
17223a40ed3dSBarry Smith   PetscFunctionBegin;
172333f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
172433f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1725cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
17263a40ed3dSBarry Smith     PetscFunctionReturn(0);
17273a40ed3dSBarry Smith   }
1728e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1729a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
17300dbb7854Svictorle     for (j=0; j<n; j++) {
1731a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1732a5ce6ee0Svictorle     }
1733a5ce6ee0Svictorle   } else {
1734d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1735a5ce6ee0Svictorle   }
1736273d9f13SBarry Smith   PetscFunctionReturn(0);
1737273d9f13SBarry Smith }
1738273d9f13SBarry Smith 
17394a2ae208SSatish Balay #undef __FUNCT__
17404994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
1741*e0877f53SBarry Smith static PetscErrorCode MatSetUp_SeqDense(Mat A)
1742273d9f13SBarry Smith {
1743dfbe8321SBarry Smith   PetscErrorCode ierr;
1744273d9f13SBarry Smith 
1745273d9f13SBarry Smith   PetscFunctionBegin;
1746273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
17473a40ed3dSBarry Smith   PetscFunctionReturn(0);
17484b0e389bSBarry Smith }
17494b0e389bSBarry Smith 
1750284134d9SBarry Smith #undef __FUNCT__
1751ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1752ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1753ba337c44SJed Brown {
1754ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1755ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1756ba337c44SJed Brown   PetscScalar  *aa = a->v;
1757ba337c44SJed Brown 
1758ba337c44SJed Brown   PetscFunctionBegin;
1759ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1760ba337c44SJed Brown   PetscFunctionReturn(0);
1761ba337c44SJed Brown }
1762ba337c44SJed Brown 
1763ba337c44SJed Brown #undef __FUNCT__
1764ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1765ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1766ba337c44SJed Brown {
1767ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1768ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1769ba337c44SJed Brown   PetscScalar  *aa = a->v;
1770ba337c44SJed Brown 
1771ba337c44SJed Brown   PetscFunctionBegin;
1772ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1773ba337c44SJed Brown   PetscFunctionReturn(0);
1774ba337c44SJed Brown }
1775ba337c44SJed Brown 
1776ba337c44SJed Brown #undef __FUNCT__
1777ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1778ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1779ba337c44SJed Brown {
1780ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1781ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1782ba337c44SJed Brown   PetscScalar  *aa = a->v;
1783ba337c44SJed Brown 
1784ba337c44SJed Brown   PetscFunctionBegin;
1785ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1786ba337c44SJed Brown   PetscFunctionReturn(0);
1787ba337c44SJed Brown }
1788284134d9SBarry Smith 
1789a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1790a9fe9ddaSSatish Balay #undef __FUNCT__
1791a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1792a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1793a9fe9ddaSSatish Balay {
1794a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1795a9fe9ddaSSatish Balay 
1796a9fe9ddaSSatish Balay   PetscFunctionBegin;
1797a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
17983ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1799a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
18003ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1801a9fe9ddaSSatish Balay   }
18023ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1803a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
18043ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1805a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1806a9fe9ddaSSatish Balay }
1807a9fe9ddaSSatish Balay 
1808a9fe9ddaSSatish Balay #undef __FUNCT__
1809a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1810a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1811a9fe9ddaSSatish Balay {
1812ee16a9a1SHong Zhang   PetscErrorCode ierr;
1813d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1814ee16a9a1SHong Zhang   Mat            Cmat;
1815a9fe9ddaSSatish Balay 
1816ee16a9a1SHong Zhang   PetscFunctionBegin;
1817e32f2f54SBarry Smith   if (A->cmap->n != B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->cmap->n %d != B->rmap->n %d\n",A->cmap->n,B->rmap->n);
1818ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1819ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1820ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
18210298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1822d73949e8SHong Zhang 
1823ee16a9a1SHong Zhang   *C = Cmat;
1824ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1825ee16a9a1SHong Zhang }
1826a9fe9ddaSSatish Balay 
182798a3b096SSatish Balay #undef __FUNCT__
1828a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1829a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1830a9fe9ddaSSatish Balay {
1831a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1832a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1833a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
18340805154bSBarry Smith   PetscBLASInt   m,n,k;
1835a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1836c5df96a5SBarry Smith   PetscErrorCode ierr;
1837fd4e9aacSBarry Smith   PetscBool      flg;
1838a9fe9ddaSSatish Balay 
1839a9fe9ddaSSatish Balay   PetscFunctionBegin;
1840fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr);
1841fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense");
1842fd4e9aacSBarry Smith 
1843fd4e9aacSBarry Smith   /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/
1844fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr);
1845fd4e9aacSBarry Smith   if (flg) {
1846fd4e9aacSBarry Smith     C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense;
1847fd4e9aacSBarry Smith     ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr);
1848fd4e9aacSBarry Smith     PetscFunctionReturn(0);
1849fd4e9aacSBarry Smith   }
1850fd4e9aacSBarry Smith 
1851fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr);
1852fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense");
1853c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1854c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1855c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
18565ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1857a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1858a9fe9ddaSSatish Balay }
1859a9fe9ddaSSatish Balay 
1860a9fe9ddaSSatish Balay #undef __FUNCT__
186175648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
186275648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1863a9fe9ddaSSatish Balay {
1864a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1865a9fe9ddaSSatish Balay 
1866a9fe9ddaSSatish Balay   PetscFunctionBegin;
1867a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
18683ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
186975648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
18703ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1871a9fe9ddaSSatish Balay   }
18723ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
187375648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
18743ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1875a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1876a9fe9ddaSSatish Balay }
1877a9fe9ddaSSatish Balay 
1878a9fe9ddaSSatish Balay #undef __FUNCT__
187975648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
188075648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1881a9fe9ddaSSatish Balay {
1882ee16a9a1SHong Zhang   PetscErrorCode ierr;
1883d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1884ee16a9a1SHong Zhang   Mat            Cmat;
1885a9fe9ddaSSatish Balay 
1886ee16a9a1SHong Zhang   PetscFunctionBegin;
1887e32f2f54SBarry Smith   if (A->rmap->n != B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"A->rmap->n %d != B->rmap->n %d\n",A->rmap->n,B->rmap->n);
1888ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1889ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1890ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
18910298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
18922205254eSKarl Rupp 
1893ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
18942205254eSKarl Rupp 
1895ee16a9a1SHong Zhang   *C = Cmat;
1896ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1897ee16a9a1SHong Zhang }
1898a9fe9ddaSSatish Balay 
1899a9fe9ddaSSatish Balay #undef __FUNCT__
190075648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
190175648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1902a9fe9ddaSSatish Balay {
1903a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1904a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1905a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
19060805154bSBarry Smith   PetscBLASInt   m,n,k;
1907a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1908c5df96a5SBarry Smith   PetscErrorCode ierr;
1909a9fe9ddaSSatish Balay 
1910a9fe9ddaSSatish Balay   PetscFunctionBegin;
1911c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1912c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1913c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
19142fbe02b9SBarry Smith   /*
19152fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
19162fbe02b9SBarry Smith   */
19175ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1918a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1919a9fe9ddaSSatish Balay }
1920985db425SBarry Smith 
1921985db425SBarry Smith #undef __FUNCT__
1922985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1923*e0877f53SBarry Smith static PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1924985db425SBarry Smith {
1925985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1926985db425SBarry Smith   PetscErrorCode ierr;
1927d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1928985db425SBarry Smith   PetscScalar    *x;
1929985db425SBarry Smith   MatScalar      *aa = a->v;
1930985db425SBarry Smith 
1931985db425SBarry Smith   PetscFunctionBegin;
1932e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1933985db425SBarry Smith 
1934985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1935985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1936985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1937e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1938985db425SBarry Smith   for (i=0; i<m; i++) {
1939985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1940985db425SBarry Smith     for (j=1; j<n; j++) {
1941985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1942985db425SBarry Smith     }
1943985db425SBarry Smith   }
1944985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1945985db425SBarry Smith   PetscFunctionReturn(0);
1946985db425SBarry Smith }
1947985db425SBarry Smith 
1948985db425SBarry Smith #undef __FUNCT__
1949985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1950*e0877f53SBarry Smith static PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1951985db425SBarry Smith {
1952985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1953985db425SBarry Smith   PetscErrorCode ierr;
1954d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1955985db425SBarry Smith   PetscScalar    *x;
1956985db425SBarry Smith   PetscReal      atmp;
1957985db425SBarry Smith   MatScalar      *aa = a->v;
1958985db425SBarry Smith 
1959985db425SBarry Smith   PetscFunctionBegin;
1960e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1961985db425SBarry Smith 
1962985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1963985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1964985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1965e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1966985db425SBarry Smith   for (i=0; i<m; i++) {
19679189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1968985db425SBarry Smith     for (j=1; j<n; j++) {
1969985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1970985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1971985db425SBarry Smith     }
1972985db425SBarry Smith   }
1973985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1974985db425SBarry Smith   PetscFunctionReturn(0);
1975985db425SBarry Smith }
1976985db425SBarry Smith 
1977985db425SBarry Smith #undef __FUNCT__
1978985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1979*e0877f53SBarry Smith static PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1980985db425SBarry Smith {
1981985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1982985db425SBarry Smith   PetscErrorCode ierr;
1983d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1984985db425SBarry Smith   PetscScalar    *x;
1985985db425SBarry Smith   MatScalar      *aa = a->v;
1986985db425SBarry Smith 
1987985db425SBarry Smith   PetscFunctionBegin;
1988e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1989985db425SBarry Smith 
1990985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1991985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1992985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1993e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1994985db425SBarry Smith   for (i=0; i<m; i++) {
1995985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1996985db425SBarry Smith     for (j=1; j<n; j++) {
1997985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1998985db425SBarry Smith     }
1999985db425SBarry Smith   }
2000985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2001985db425SBarry Smith   PetscFunctionReturn(0);
2002985db425SBarry Smith }
2003985db425SBarry Smith 
20048d0534beSBarry Smith #undef __FUNCT__
20058d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
2006*e0877f53SBarry Smith static PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
20078d0534beSBarry Smith {
20088d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
20098d0534beSBarry Smith   PetscErrorCode ierr;
20108d0534beSBarry Smith   PetscScalar    *x;
20118d0534beSBarry Smith 
20128d0534beSBarry Smith   PetscFunctionBegin;
2013e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
20148d0534beSBarry Smith 
20158d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2016d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
20178d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
20188d0534beSBarry Smith   PetscFunctionReturn(0);
20198d0534beSBarry Smith }
20208d0534beSBarry Smith 
20210716a85fSBarry Smith 
20220716a85fSBarry Smith #undef __FUNCT__
20230716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
20240716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
20250716a85fSBarry Smith {
20260716a85fSBarry Smith   PetscErrorCode ierr;
20270716a85fSBarry Smith   PetscInt       i,j,m,n;
20280716a85fSBarry Smith   PetscScalar    *a;
20290716a85fSBarry Smith 
20300716a85fSBarry Smith   PetscFunctionBegin;
20310716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
20320716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
20338c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
20340716a85fSBarry Smith   if (type == NORM_2) {
20350716a85fSBarry Smith     for (i=0; i<n; i++) {
20360716a85fSBarry Smith       for (j=0; j<m; j++) {
20370716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
20380716a85fSBarry Smith       }
20390716a85fSBarry Smith       a += m;
20400716a85fSBarry Smith     }
20410716a85fSBarry Smith   } else if (type == NORM_1) {
20420716a85fSBarry Smith     for (i=0; i<n; i++) {
20430716a85fSBarry Smith       for (j=0; j<m; j++) {
20440716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
20450716a85fSBarry Smith       }
20460716a85fSBarry Smith       a += m;
20470716a85fSBarry Smith     }
20480716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
20490716a85fSBarry Smith     for (i=0; i<n; i++) {
20500716a85fSBarry Smith       for (j=0; j<m; j++) {
20510716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
20520716a85fSBarry Smith       }
20530716a85fSBarry Smith       a += m;
20540716a85fSBarry Smith     }
2055ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
20568c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
20570716a85fSBarry Smith   if (type == NORM_2) {
20588f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
20590716a85fSBarry Smith   }
20600716a85fSBarry Smith   PetscFunctionReturn(0);
20610716a85fSBarry Smith }
20620716a85fSBarry Smith 
206373a71a0fSBarry Smith #undef __FUNCT__
206473a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
206573a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
206673a71a0fSBarry Smith {
206773a71a0fSBarry Smith   PetscErrorCode ierr;
206873a71a0fSBarry Smith   PetscScalar    *a;
206973a71a0fSBarry Smith   PetscInt       m,n,i;
207073a71a0fSBarry Smith 
207173a71a0fSBarry Smith   PetscFunctionBegin;
207273a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
20738c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
207473a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
207573a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
207673a71a0fSBarry Smith   }
20778c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
207873a71a0fSBarry Smith   PetscFunctionReturn(0);
207973a71a0fSBarry Smith }
208073a71a0fSBarry Smith 
20813b49f96aSBarry Smith #undef __FUNCT__
20823b49f96aSBarry Smith #define __FUNCT__ "MatMissingDiagonal_SeqDense"
20833b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool  *missing,PetscInt *d)
20843b49f96aSBarry Smith {
20853b49f96aSBarry Smith   PetscFunctionBegin;
20863b49f96aSBarry Smith   *missing = PETSC_FALSE;
20873b49f96aSBarry Smith   PetscFunctionReturn(0);
20883b49f96aSBarry Smith }
208973a71a0fSBarry Smith 
2090abc3b08eSStefano Zampini 
2091289bc588SBarry Smith /* -------------------------------------------------------------------*/
2092a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
2093905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
2094905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
2095905e6a2fSBarry Smith                                         MatMult_SeqDense,
209697304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
20977c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
20987c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
2099db4efbfdSBarry Smith                                         0,
2100db4efbfdSBarry Smith                                         0,
2101db4efbfdSBarry Smith                                         0,
2102db4efbfdSBarry Smith                                 /* 10*/ 0,
2103905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
2104905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
210541f059aeSBarry Smith                                         MatSOR_SeqDense,
2106ec8511deSBarry Smith                                         MatTranspose_SeqDense,
210797304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
2108905e6a2fSBarry Smith                                         MatEqual_SeqDense,
2109905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
2110905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
2111905e6a2fSBarry Smith                                         MatNorm_SeqDense,
2112c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
2113c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
2114905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
2115905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
2116d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
2117db4efbfdSBarry Smith                                         0,
2118db4efbfdSBarry Smith                                         0,
2119db4efbfdSBarry Smith                                         0,
2120db4efbfdSBarry Smith                                         0,
21214994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2122273d9f13SBarry Smith                                         0,
2123905e6a2fSBarry Smith                                         0,
212473a71a0fSBarry Smith                                         0,
212573a71a0fSBarry Smith                                         0,
2126d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2127a5ae1ecdSBarry Smith                                         0,
2128a5ae1ecdSBarry Smith                                         0,
2129a5ae1ecdSBarry Smith                                         0,
2130a5ae1ecdSBarry Smith                                         0,
2131d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
2132a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
2133a5ae1ecdSBarry Smith                                         0,
21344b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2135a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2136d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2137a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
21387d68702bSBarry Smith                                         MatShift_Basic,
2139a5ae1ecdSBarry Smith                                         0,
2140a5ae1ecdSBarry Smith                                         0,
214173a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2142a5ae1ecdSBarry Smith                                         0,
2143a5ae1ecdSBarry Smith                                         0,
2144a5ae1ecdSBarry Smith                                         0,
2145a5ae1ecdSBarry Smith                                         0,
2146d519adbfSMatthew Knepley                                 /* 54*/ 0,
2147a5ae1ecdSBarry Smith                                         0,
2148a5ae1ecdSBarry Smith                                         0,
2149a5ae1ecdSBarry Smith                                         0,
2150a5ae1ecdSBarry Smith                                         0,
2151d519adbfSMatthew Knepley                                 /* 59*/ 0,
2152e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2153e03a110bSBarry Smith                                         MatView_SeqDense,
2154357abbc8SBarry Smith                                         0,
215597304618SKris Buschelman                                         0,
2156d519adbfSMatthew Knepley                                 /* 64*/ 0,
215797304618SKris Buschelman                                         0,
215897304618SKris Buschelman                                         0,
215997304618SKris Buschelman                                         0,
216097304618SKris Buschelman                                         0,
2161d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
216297304618SKris Buschelman                                         0,
216397304618SKris Buschelman                                         0,
216497304618SKris Buschelman                                         0,
216597304618SKris Buschelman                                         0,
2166d519adbfSMatthew Knepley                                 /* 74*/ 0,
216797304618SKris Buschelman                                         0,
216897304618SKris Buschelman                                         0,
216997304618SKris Buschelman                                         0,
217097304618SKris Buschelman                                         0,
2171d519adbfSMatthew Knepley                                 /* 79*/ 0,
217297304618SKris Buschelman                                         0,
217397304618SKris Buschelman                                         0,
217497304618SKris Buschelman                                         0,
21755bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2176865e5f61SKris Buschelman                                         0,
21771cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2178865e5f61SKris Buschelman                                         0,
2179865e5f61SKris Buschelman                                         0,
2180865e5f61SKris Buschelman                                         0,
2181d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2182a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2183a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2184abc3b08eSStefano Zampini                                         MatPtAP_SeqDense_SeqDense,
2185abc3b08eSStefano Zampini                                         MatPtAPSymbolic_SeqDense_SeqDense,
2186abc3b08eSStefano Zampini                                 /* 94*/ MatPtAPNumeric_SeqDense_SeqDense,
21875df89d91SHong Zhang                                         0,
21885df89d91SHong Zhang                                         0,
21895df89d91SHong Zhang                                         0,
2190284134d9SBarry Smith                                         0,
2191d519adbfSMatthew Knepley                                 /* 99*/ 0,
2192284134d9SBarry Smith                                         0,
2193284134d9SBarry Smith                                         0,
2194ba337c44SJed Brown                                         MatConjugate_SeqDense,
2195f73d5cc4SBarry Smith                                         0,
2196ba337c44SJed Brown                                 /*104*/ 0,
2197ba337c44SJed Brown                                         MatRealPart_SeqDense,
2198ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2199985db425SBarry Smith                                         0,
2200985db425SBarry Smith                                         0,
220185e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2202985db425SBarry Smith                                         0,
22038d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2204aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
22053b49f96aSBarry Smith                                         MatMissingDiagonal_SeqDense,
2206aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2207aabbc4fbSShri Abhyankar                                         0,
2208aabbc4fbSShri Abhyankar                                         0,
2209aabbc4fbSShri Abhyankar                                         0,
2210aabbc4fbSShri Abhyankar                                         0,
2211aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2212aabbc4fbSShri Abhyankar                                         0,
2213aabbc4fbSShri Abhyankar                                         0,
22140716a85fSBarry Smith                                         0,
22150716a85fSBarry Smith                                         0,
22160716a85fSBarry Smith                                 /*124*/ 0,
22175df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
22185df89d91SHong Zhang                                         0,
22195df89d91SHong Zhang                                         0,
22205df89d91SHong Zhang                                         0,
22215df89d91SHong Zhang                                 /*129*/ 0,
222275648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
222375648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
222475648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
22253964eb88SJed Brown                                         0,
22263964eb88SJed Brown                                 /*134*/ 0,
22273964eb88SJed Brown                                         0,
22283964eb88SJed Brown                                         0,
22293964eb88SJed Brown                                         0,
22303964eb88SJed Brown                                         0,
22313964eb88SJed Brown                                 /*139*/ 0,
2232f9426fe0SMark Adams                                         0,
22333964eb88SJed Brown                                         0
2234985db425SBarry Smith };
223590ace30eSBarry Smith 
22364a2ae208SSatish Balay #undef __FUNCT__
22374a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
22384b828684SBarry Smith /*@C
2239fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2240d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2241d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2242289bc588SBarry Smith 
2243db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2244db81eaa0SLois Curfman McInnes 
224520563c6bSBarry Smith    Input Parameters:
2246db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
22470c775827SLois Curfman McInnes .  m - number of rows
224818f449edSLois Curfman McInnes .  n - number of columns
22490298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2250dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
225120563c6bSBarry Smith 
225220563c6bSBarry Smith    Output Parameter:
225344cd7ae7SLois Curfman McInnes .  A - the matrix
225420563c6bSBarry Smith 
2255b259b22eSLois Curfman McInnes    Notes:
225618f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
225718f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
22580298fd71SBarry Smith    set data=NULL.
225918f449edSLois Curfman McInnes 
2260027ccd11SLois Curfman McInnes    Level: intermediate
2261027ccd11SLois Curfman McInnes 
2262dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2263d65003e9SLois Curfman McInnes 
226469b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
226520563c6bSBarry Smith @*/
22667087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2267289bc588SBarry Smith {
2268dfbe8321SBarry Smith   PetscErrorCode ierr;
22693b2fbd54SBarry Smith 
22703a40ed3dSBarry Smith   PetscFunctionBegin;
2271f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2272f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2273273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2274273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2275273d9f13SBarry Smith   PetscFunctionReturn(0);
2276273d9f13SBarry Smith }
2277273d9f13SBarry Smith 
22784a2ae208SSatish Balay #undef __FUNCT__
2279afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2280273d9f13SBarry Smith /*@C
2281273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2282273d9f13SBarry Smith 
2283273d9f13SBarry Smith    Collective on MPI_Comm
2284273d9f13SBarry Smith 
2285273d9f13SBarry Smith    Input Parameters:
22861c4f3114SJed Brown +  B - the matrix
22870298fd71SBarry Smith -  data - the array (or NULL)
2288273d9f13SBarry Smith 
2289273d9f13SBarry Smith    Notes:
2290273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2291273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2292284134d9SBarry Smith    need not call this routine.
2293273d9f13SBarry Smith 
2294273d9f13SBarry Smith    Level: intermediate
2295273d9f13SBarry Smith 
2296273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2297273d9f13SBarry Smith 
229869b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2299867c911aSBarry Smith 
2300273d9f13SBarry Smith @*/
23017087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2302273d9f13SBarry Smith {
23034ac538c5SBarry Smith   PetscErrorCode ierr;
2304a23d5eceSKris Buschelman 
2305a23d5eceSKris Buschelman   PetscFunctionBegin;
23064ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2307a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2308a23d5eceSKris Buschelman }
2309a23d5eceSKris Buschelman 
2310a23d5eceSKris Buschelman #undef __FUNCT__
2311afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
23127087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2313a23d5eceSKris Buschelman {
2314273d9f13SBarry Smith   Mat_SeqDense   *b;
2315dfbe8321SBarry Smith   PetscErrorCode ierr;
2316273d9f13SBarry Smith 
2317273d9f13SBarry Smith   PetscFunctionBegin;
2318273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2319a868139aSShri Abhyankar 
232034ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
232134ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
232234ef9618SShri Abhyankar 
2323273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
232486d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
232586d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
232686d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
232786d161a7SShri Abhyankar 
23289e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
23299e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2330e92229d0SSatish Balay     ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr);
23313bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
23322205254eSKarl Rupp 
23339e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2334273d9f13SBarry Smith   } else { /* user-allocated storage */
23359e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2336273d9f13SBarry Smith     b->v          = data;
2337273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2338273d9f13SBarry Smith   }
23390450473dSBarry Smith   B->assembled = PETSC_TRUE;
2340273d9f13SBarry Smith   PetscFunctionReturn(0);
2341273d9f13SBarry Smith }
2342273d9f13SBarry Smith 
234365b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
23441b807ce4Svictorle #undef __FUNCT__
23458baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental"
23468baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
23478baccfbdSHong Zhang {
2348d77f618aSHong Zhang   Mat            mat_elemental;
2349d77f618aSHong Zhang   PetscErrorCode ierr;
2350d77f618aSHong Zhang   PetscScalar    *array,*v_colwise;
2351d77f618aSHong Zhang   PetscInt       M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
2352d77f618aSHong Zhang 
23538baccfbdSHong Zhang   PetscFunctionBegin;
2354d77f618aSHong Zhang   ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr);
2355d77f618aSHong Zhang   ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr);
2356d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
2357d77f618aSHong Zhang   k = 0;
2358d77f618aSHong Zhang   for (j=0; j<N; j++) {
2359d77f618aSHong Zhang     cols[j] = j;
2360d77f618aSHong Zhang     for (i=0; i<M; i++) {
2361d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
2362d77f618aSHong Zhang     }
2363d77f618aSHong Zhang   }
2364d77f618aSHong Zhang   for (i=0; i<M; i++) {
2365d77f618aSHong Zhang     rows[i] = i;
2366d77f618aSHong Zhang   }
2367d77f618aSHong Zhang   ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr);
2368d77f618aSHong Zhang 
2369d77f618aSHong Zhang   ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr);
2370d77f618aSHong Zhang   ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
2371d77f618aSHong Zhang   ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr);
2372d77f618aSHong Zhang   ierr = MatSetUp(mat_elemental);CHKERRQ(ierr);
2373d77f618aSHong Zhang 
2374d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
2375d77f618aSHong Zhang   ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr);
2376d77f618aSHong Zhang   ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2377d77f618aSHong Zhang   ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2378d77f618aSHong Zhang   ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr);
2379d77f618aSHong Zhang 
2380511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
238128be2f97SBarry Smith     ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr);
2382d77f618aSHong Zhang   } else {
2383d77f618aSHong Zhang     *newmat = mat_elemental;
2384d77f618aSHong Zhang   }
23858baccfbdSHong Zhang   PetscFunctionReturn(0);
23868baccfbdSHong Zhang }
238765b80a83SHong Zhang #endif
23888baccfbdSHong Zhang 
23898baccfbdSHong Zhang #undef __FUNCT__
23901b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
23911b807ce4Svictorle /*@C
23921b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
23931b807ce4Svictorle 
23941b807ce4Svictorle   Input parameter:
23951b807ce4Svictorle + A - the matrix
23961b807ce4Svictorle - lda - the leading dimension
23971b807ce4Svictorle 
23981b807ce4Svictorle   Notes:
2399867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
24001b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
24011b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
24021b807ce4Svictorle 
24031b807ce4Svictorle   Level: intermediate
24041b807ce4Svictorle 
24051b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
24061b807ce4Svictorle 
2407284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2408867c911aSBarry Smith 
24091b807ce4Svictorle @*/
24107087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
24111b807ce4Svictorle {
24121b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
241321a2c019SBarry Smith 
24141b807ce4Svictorle   PetscFunctionBegin;
2415e32f2f54SBarry Smith   if (lda < B->rmap->n) SETERRQ2(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"LDA %D must be at least matrix dimension %D",lda,B->rmap->n);
24161b807ce4Svictorle   b->lda       = lda;
241721a2c019SBarry Smith   b->changelda = PETSC_FALSE;
241821a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
24191b807ce4Svictorle   PetscFunctionReturn(0);
24201b807ce4Svictorle }
24211b807ce4Svictorle 
24220bad9183SKris Buschelman /*MC
2423fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
24240bad9183SKris Buschelman 
24250bad9183SKris Buschelman    Options Database Keys:
24260bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
24270bad9183SKris Buschelman 
24280bad9183SKris Buschelman   Level: beginner
24290bad9183SKris Buschelman 
243089665df3SBarry Smith .seealso: MatCreateSeqDense()
243189665df3SBarry Smith 
24320bad9183SKris Buschelman M*/
24330bad9183SKris Buschelman 
24344a2ae208SSatish Balay #undef __FUNCT__
24354a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
24368cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B)
2437273d9f13SBarry Smith {
2438273d9f13SBarry Smith   Mat_SeqDense   *b;
2439dfbe8321SBarry Smith   PetscErrorCode ierr;
24407c334f02SBarry Smith   PetscMPIInt    size;
2441273d9f13SBarry Smith 
2442273d9f13SBarry Smith   PetscFunctionBegin;
2443ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2444e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
244555659b69SBarry Smith 
2446b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
2447549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
244844cd7ae7SLois Curfman McInnes   B->data = (void*)b;
244918f449edSLois Curfman McInnes 
245044cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2451273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2452273d9f13SBarry Smith   b->v           = 0;
245321a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
24544e220ebcSLois Curfman McInnes 
2455bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
2456bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2457bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
24588baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
24598baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
24608baccfbdSHong Zhang #endif
2461bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
2462bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
2463bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
2464bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
2465abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr);
24663bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
24673bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
24683bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
246917667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
24703a40ed3dSBarry Smith   PetscFunctionReturn(0);
2471289bc588SBarry Smith }
2472