xref: /petsc/src/mat/impls/dense/seq/dense.c (revision 832b7ceb95bd65cfd99922d89fc8cdbc69c04de1)
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"
134f4df32b1SMatthew Knepley 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"
161dfbe8321SBarry Smith 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"
181f4df32b1SMatthew Knepley 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"
205ace3abfcSBarry Smith 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"
227719d5645SBarry Smith 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"
254dfbe8321SBarry Smith 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 
2670481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*);
268719d5645SBarry Smith 
2694a2ae208SSatish Balay #undef __FUNCT__
2704a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
2710481f469SBarry Smith 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"
284dfbe8321SBarry Smith 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"
32085e2c93fSHong Zhang 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"
367dfbe8321SBarry Smith 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"
404dfbe8321SBarry Smith 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"
454dfbe8321SBarry Smith 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"
5070481f469SBarry Smith 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"
5440481f469SBarry Smith 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"
5900481f469SBarry Smith 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"
6010481f469SBarry Smith 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"
63241f059aeSBarry Smith 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"
674dfbe8321SBarry Smith 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"
698dfbe8321SBarry Smith 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"
721dfbe8321SBarry Smith 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"
745dfbe8321SBarry Smith 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"
77113f74950SBarry Smith 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"
79413f74950SBarry Smith 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"
80613f74950SBarry Smith 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"
87813f74950SBarry Smith 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"
901112444f4SShri Abhyankar 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"
1138dfbe8321SBarry Smith 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;
1143383922c3SLisandro Dalcin   PetscInt          m  = A->rmap->n,n = A->cmap->n,i,j;
1144383922c3SLisandro Dalcin   int               color = PETSC_DRAW_WHITE;
114587828ca2SBarry Smith   PetscScalar       *v = a->v;
1146b0a32e0cSBarry Smith   PetscViewer       viewer;
1147b05fc000SLisandro Dalcin   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r;
1148f3ef73ceSBarry Smith   PetscViewerFormat format;
1149f1af5d2fSBarry Smith 
1150f1af5d2fSBarry Smith   PetscFunctionBegin;
1151f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1152b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1153b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1154f1af5d2fSBarry Smith 
1155f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1156383922c3SLisandro Dalcin 
1157fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1158383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1159f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1160f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1161383922c3SLisandro Dalcin       x_l = j; x_r = x_l + 1.0;
1162f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1163f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1164f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1165329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1166b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1167329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1168b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1169f1af5d2fSBarry Smith         } else {
1170f1af5d2fSBarry Smith           continue;
1171f1af5d2fSBarry Smith         }
1172b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1173f1af5d2fSBarry Smith       }
1174f1af5d2fSBarry Smith     }
1175383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1176f1af5d2fSBarry Smith   } else {
1177f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1178f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1179b05fc000SLisandro Dalcin     PetscReal minv = 0.0, maxv = 0.0;
1180b05fc000SLisandro Dalcin     PetscDraw popup;
1181b05fc000SLisandro Dalcin 
1182f1af5d2fSBarry Smith     for (i=0; i < m*n; i++) {
1183f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1184f1af5d2fSBarry Smith     }
1185383922c3SLisandro Dalcin     if (minv >= maxv) maxv = minv + PETSC_SMALL;
1186b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1187b05fc000SLisandro Dalcin     if (popup) {ierr = PetscDrawScalePopup(popup,minv,maxv);CHKERRQ(ierr);}
1188383922c3SLisandro Dalcin 
1189383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveBegin(draw);CHKERRQ(ierr);
1190f1af5d2fSBarry Smith     for (j=0; j<n; j++) {
1191f1af5d2fSBarry Smith       x_l = j;
1192f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1193f1af5d2fSBarry Smith       for (i=0; i<m; i++) {
1194f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1195f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1196b05fc000SLisandro Dalcin         color = PetscDrawRealToColor(PetscAbsScalar(v[j*m+i]),minv,maxv);
1197b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1198f1af5d2fSBarry Smith       }
1199f1af5d2fSBarry Smith     }
1200383922c3SLisandro Dalcin     ierr = PetscDrawCollectiveEnd(draw);CHKERRQ(ierr);
1201f1af5d2fSBarry Smith   }
1202f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1203f1af5d2fSBarry Smith }
1204f1af5d2fSBarry Smith 
12054a2ae208SSatish Balay #undef __FUNCT__
12064a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1207dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1208f1af5d2fSBarry Smith {
1209b0a32e0cSBarry Smith   PetscDraw      draw;
1210ace3abfcSBarry Smith   PetscBool      isnull;
1211329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1212dfbe8321SBarry Smith   PetscErrorCode ierr;
1213f1af5d2fSBarry Smith 
1214f1af5d2fSBarry Smith   PetscFunctionBegin;
1215b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1216b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1217abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1218f1af5d2fSBarry Smith 
1219d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1220f1af5d2fSBarry Smith   xr  += w;          yr += h;        xl = -w;     yl = -h;
1221b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1222*832b7cebSLisandro Dalcin   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1223b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
12240298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1225*832b7cebSLisandro Dalcin   ierr = PetscDrawSave(draw);CHKERRQ(ierr);
1226f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1227f1af5d2fSBarry Smith }
1228f1af5d2fSBarry Smith 
12294a2ae208SSatish Balay #undef __FUNCT__
12304a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1231dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1232932b0c3eSLois Curfman McInnes {
1233dfbe8321SBarry Smith   PetscErrorCode ierr;
1234ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1235932b0c3eSLois Curfman McInnes 
12363a40ed3dSBarry Smith   PetscFunctionBegin;
1237251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1238251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1239251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
12400f5bd95cSBarry Smith 
1241c45a1595SBarry Smith   if (iascii) {
1242c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
12430f5bd95cSBarry Smith   } else if (isbinary) {
12443a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1245f1af5d2fSBarry Smith   } else if (isdraw) {
1246f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1247932b0c3eSLois Curfman McInnes   }
12483a40ed3dSBarry Smith   PetscFunctionReturn(0);
1249932b0c3eSLois Curfman McInnes }
1250289bc588SBarry Smith 
12514a2ae208SSatish Balay #undef __FUNCT__
12524a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1253dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1254289bc588SBarry Smith {
1255ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1256dfbe8321SBarry Smith   PetscErrorCode ierr;
125790f02eecSBarry Smith 
12583a40ed3dSBarry Smith   PetscFunctionBegin;
1259aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1260d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1261a5a9c739SBarry Smith #endif
126205b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
1263abc3b08eSStefano Zampini   ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr);
12646857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1265bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1266dbd8c25aSHong Zhang 
1267dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1268bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
1269bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
12708baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr);
12718baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
12728baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr);
12738baccfbdSHong Zhang #endif
1274bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
1275bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1276bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1277bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1278abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12793bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12803bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12813bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12823a40ed3dSBarry Smith   PetscFunctionReturn(0);
1283289bc588SBarry Smith }
1284289bc588SBarry Smith 
12854a2ae208SSatish Balay #undef __FUNCT__
12864a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1287fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1288289bc588SBarry Smith {
1289c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
12906849ba73SBarry Smith   PetscErrorCode ierr;
129113f74950SBarry Smith   PetscInt       k,j,m,n,M;
129287828ca2SBarry Smith   PetscScalar    *v,tmp;
129348b35521SBarry Smith 
12943a40ed3dSBarry Smith   PetscFunctionBegin;
1295d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1296e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1297e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1298e7e72b3dSBarry Smith     else {
1299d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1300289bc588SBarry Smith         for (k=0; k<j; k++) {
13011b807ce4Svictorle           tmp        = v[j + k*M];
13021b807ce4Svictorle           v[j + k*M] = v[k + j*M];
13031b807ce4Svictorle           v[k + j*M] = tmp;
1304289bc588SBarry Smith         }
1305289bc588SBarry Smith       }
1306d64ed03dSBarry Smith     }
13073a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1308d3e5ee88SLois Curfman McInnes     Mat          tmat;
1309ec8511deSBarry Smith     Mat_SeqDense *tmatd;
131087828ca2SBarry Smith     PetscScalar  *v2;
1311af36a384SStefano Zampini     PetscInt     M2;
1312ea709b57SSatish Balay 
1313fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
1314ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1315d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
13167adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
13170298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1318fc4dec0aSBarry Smith     } else {
1319fc4dec0aSBarry Smith       tmat = *matout;
1320fc4dec0aSBarry Smith     }
1321ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
1322af36a384SStefano Zampini     v = mat->v; v2 = tmatd->v; M2 = tmatd->lda;
1323d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
1324af36a384SStefano Zampini       for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M];
1325d3e5ee88SLois Curfman McInnes     }
13266d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
13276d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1328d3e5ee88SLois Curfman McInnes     *matout = tmat;
132948b35521SBarry Smith   }
13303a40ed3dSBarry Smith   PetscFunctionReturn(0);
1331289bc588SBarry Smith }
1332289bc588SBarry Smith 
13334a2ae208SSatish Balay #undef __FUNCT__
13344a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1335ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1336289bc588SBarry Smith {
1337c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1338c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
133913f74950SBarry Smith   PetscInt     i,j;
1340a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
13419ea5d5aeSSatish Balay 
13423a40ed3dSBarry Smith   PetscFunctionBegin;
1343d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1344d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1345d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
13461b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1347d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
13483a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
13491b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
13501b807ce4Svictorle     }
1351289bc588SBarry Smith   }
135277c4ece6SBarry Smith   *flg = PETSC_TRUE;
13533a40ed3dSBarry Smith   PetscFunctionReturn(0);
1354289bc588SBarry Smith }
1355289bc588SBarry Smith 
13564a2ae208SSatish Balay #undef __FUNCT__
13574a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1358dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1359289bc588SBarry Smith {
1360c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1361dfbe8321SBarry Smith   PetscErrorCode ierr;
136213f74950SBarry Smith   PetscInt       i,n,len;
136387828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
136444cd7ae7SLois Curfman McInnes 
13653a40ed3dSBarry Smith   PetscFunctionBegin;
13662dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
13677a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
13681ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1369d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1370e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
137144cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
13721b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1373289bc588SBarry Smith   }
13741ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
13753a40ed3dSBarry Smith   PetscFunctionReturn(0);
1376289bc588SBarry Smith }
1377289bc588SBarry Smith 
13784a2ae208SSatish Balay #undef __FUNCT__
13794a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1380dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1381289bc588SBarry Smith {
1382c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1383f1ceaac6SMatthew G. Knepley   const PetscScalar *l,*r;
1384f1ceaac6SMatthew G. Knepley   PetscScalar       x,*v;
1385dfbe8321SBarry Smith   PetscErrorCode    ierr;
1386d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n;
138755659b69SBarry Smith 
13883a40ed3dSBarry Smith   PetscFunctionBegin;
138928988994SBarry Smith   if (ll) {
13907a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
1391f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr);
1392e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1393da3a660dSBarry Smith     for (i=0; i<m; i++) {
1394da3a660dSBarry Smith       x = l[i];
1395da3a660dSBarry Smith       v = mat->v + i;
1396b43bac26SStefano Zampini       for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;}
1397da3a660dSBarry Smith     }
1398f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr);
1399eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1400da3a660dSBarry Smith   }
140128988994SBarry Smith   if (rr) {
14027a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
1403f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr);
1404e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1405da3a660dSBarry Smith     for (i=0; i<n; i++) {
1406da3a660dSBarry Smith       x = r[i];
1407b43bac26SStefano Zampini       v = mat->v + i*mat->lda;
14082205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1409da3a660dSBarry Smith     }
1410f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr);
1411eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1412da3a660dSBarry Smith   }
14133a40ed3dSBarry Smith   PetscFunctionReturn(0);
1414289bc588SBarry Smith }
1415289bc588SBarry Smith 
14164a2ae208SSatish Balay #undef __FUNCT__
14174a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1418dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1419289bc588SBarry Smith {
1420c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
142187828ca2SBarry Smith   PetscScalar    *v   = mat->v;
1422329f5518SBarry Smith   PetscReal      sum  = 0.0;
1423d0f46423SBarry Smith   PetscInt       lda  =mat->lda,m=A->rmap->n,i,j;
1424efee365bSSatish Balay   PetscErrorCode ierr;
142555659b69SBarry Smith 
14263a40ed3dSBarry Smith   PetscFunctionBegin;
1427289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1428a5ce6ee0Svictorle     if (lda>m) {
1429d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1430a5ce6ee0Svictorle         v = mat->v+j*lda;
1431a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1432a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1433a5ce6ee0Svictorle         }
1434a5ce6ee0Svictorle       }
1435a5ce6ee0Svictorle     } else {
1436d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1437329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1438289bc588SBarry Smith       }
1439a5ce6ee0Svictorle     }
14408f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1441dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
14423a40ed3dSBarry Smith   } else if (type == NORM_1) {
1443064f8208SBarry Smith     *nrm = 0.0;
1444d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
14451b807ce4Svictorle       v   = mat->v + j*mat->lda;
1446289bc588SBarry Smith       sum = 0.0;
1447d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
144833a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1449289bc588SBarry Smith       }
1450064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1451289bc588SBarry Smith     }
1452eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
14533a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1454064f8208SBarry Smith     *nrm = 0.0;
1455d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1456289bc588SBarry Smith       v   = mat->v + j;
1457289bc588SBarry Smith       sum = 0.0;
1458d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
14591b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1460289bc588SBarry Smith       }
1461064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1462289bc588SBarry Smith     }
1463eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1464e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
14653a40ed3dSBarry Smith   PetscFunctionReturn(0);
1466289bc588SBarry Smith }
1467289bc588SBarry Smith 
14684a2ae208SSatish Balay #undef __FUNCT__
14694a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1470ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1471289bc588SBarry Smith {
1472c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
147363ba0a88SBarry Smith   PetscErrorCode ierr;
147467e560aaSBarry Smith 
14753a40ed3dSBarry Smith   PetscFunctionBegin;
1476b5a2b587SKris Buschelman   switch (op) {
1477b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
14784e0d8c25SBarry Smith     aij->roworiented = flg;
1479b5a2b587SKris Buschelman     break;
1480512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1481b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
14823971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
14834e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
148413fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1485b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1486b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
14875021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
14885021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
14895021d80fSJed Brown     break;
14905021d80fSJed Brown   case MAT_SPD:
149177e54ba9SKris Buschelman   case MAT_SYMMETRIC:
149277e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
14939a4540c5SBarry Smith   case MAT_HERMITIAN:
14949a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
14955021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
149677e54ba9SKris Buschelman     break;
1497b5a2b587SKris Buschelman   default:
1498e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
14993a40ed3dSBarry Smith   }
15003a40ed3dSBarry Smith   PetscFunctionReturn(0);
1501289bc588SBarry Smith }
1502289bc588SBarry Smith 
15034a2ae208SSatish Balay #undef __FUNCT__
15044a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1505dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
15066f0a148fSBarry Smith {
1507ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
15086849ba73SBarry Smith   PetscErrorCode ierr;
1509d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
15103a40ed3dSBarry Smith 
15113a40ed3dSBarry Smith   PetscFunctionBegin;
1512a5ce6ee0Svictorle   if (lda>m) {
1513d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1514a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1515a5ce6ee0Svictorle     }
1516a5ce6ee0Svictorle   } else {
1517d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1518a5ce6ee0Svictorle   }
15193a40ed3dSBarry Smith   PetscFunctionReturn(0);
15206f0a148fSBarry Smith }
15216f0a148fSBarry Smith 
15224a2ae208SSatish Balay #undef __FUNCT__
15234a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
15242b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
15256f0a148fSBarry Smith {
152697b48c8fSBarry Smith   PetscErrorCode    ierr;
1527ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1528b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
152997b48c8fSBarry Smith   PetscScalar       *slot,*bb;
153097b48c8fSBarry Smith   const PetscScalar *xx;
153155659b69SBarry Smith 
15323a40ed3dSBarry Smith   PetscFunctionBegin;
1533b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1534b9679d65SBarry Smith   for (i=0; i<N; i++) {
1535b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1536b9679d65SBarry 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);
1537b9679d65SBarry Smith   }
1538b9679d65SBarry Smith #endif
1539b9679d65SBarry Smith 
154097b48c8fSBarry Smith   /* fix right hand side if needed */
154197b48c8fSBarry Smith   if (x && b) {
154297b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
154397b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
15442205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
154597b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
154697b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
154797b48c8fSBarry Smith   }
154897b48c8fSBarry Smith 
15496f0a148fSBarry Smith   for (i=0; i<N; i++) {
15506f0a148fSBarry Smith     slot = l->v + rows[i];
1551b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
15526f0a148fSBarry Smith   }
1553f4df32b1SMatthew Knepley   if (diag != 0.0) {
1554b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
15556f0a148fSBarry Smith     for (i=0; i<N; i++) {
1556b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1557f4df32b1SMatthew Knepley       *slot = diag;
15586f0a148fSBarry Smith     }
15596f0a148fSBarry Smith   }
15603a40ed3dSBarry Smith   PetscFunctionReturn(0);
15616f0a148fSBarry Smith }
1562557bce09SLois Curfman McInnes 
15634a2ae208SSatish Balay #undef __FUNCT__
15648c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
15658c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
156664e87e97SBarry Smith {
1567c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
15683a40ed3dSBarry Smith 
15693a40ed3dSBarry Smith   PetscFunctionBegin;
1570e32f2f54SBarry 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");
157164e87e97SBarry Smith   *array = mat->v;
15723a40ed3dSBarry Smith   PetscFunctionReturn(0);
157364e87e97SBarry Smith }
15740754003eSLois Curfman McInnes 
15754a2ae208SSatish Balay #undef __FUNCT__
15768c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
15778c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1578ff14e315SSatish Balay {
15793a40ed3dSBarry Smith   PetscFunctionBegin;
158009b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
15813a40ed3dSBarry Smith   PetscFunctionReturn(0);
1582ff14e315SSatish Balay }
15830754003eSLois Curfman McInnes 
15844a2ae208SSatish Balay #undef __FUNCT__
15858c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1586dec5eb66SMatthew G Knepley /*@C
15878c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
158873a71a0fSBarry Smith 
158973a71a0fSBarry Smith    Not Collective
159073a71a0fSBarry Smith 
159173a71a0fSBarry Smith    Input Parameter:
1592579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
159373a71a0fSBarry Smith 
159473a71a0fSBarry Smith    Output Parameter:
159573a71a0fSBarry Smith .   array - pointer to the data
159673a71a0fSBarry Smith 
159773a71a0fSBarry Smith    Level: intermediate
159873a71a0fSBarry Smith 
15998c778c55SBarry Smith .seealso: MatDenseRestoreArray()
160073a71a0fSBarry Smith @*/
16018c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
160273a71a0fSBarry Smith {
160373a71a0fSBarry Smith   PetscErrorCode ierr;
160473a71a0fSBarry Smith 
160573a71a0fSBarry Smith   PetscFunctionBegin;
16068c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
160773a71a0fSBarry Smith   PetscFunctionReturn(0);
160873a71a0fSBarry Smith }
160973a71a0fSBarry Smith 
161073a71a0fSBarry Smith #undef __FUNCT__
16118c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1612dec5eb66SMatthew G Knepley /*@C
1613579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
161473a71a0fSBarry Smith 
161573a71a0fSBarry Smith    Not Collective
161673a71a0fSBarry Smith 
161773a71a0fSBarry Smith    Input Parameters:
1618579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
161973a71a0fSBarry Smith .  array - pointer to the data
162073a71a0fSBarry Smith 
162173a71a0fSBarry Smith    Level: intermediate
162273a71a0fSBarry Smith 
16238c778c55SBarry Smith .seealso: MatDenseGetArray()
162473a71a0fSBarry Smith @*/
16258c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
162673a71a0fSBarry Smith {
162773a71a0fSBarry Smith   PetscErrorCode ierr;
162873a71a0fSBarry Smith 
162973a71a0fSBarry Smith   PetscFunctionBegin;
16308c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
163173a71a0fSBarry Smith   PetscFunctionReturn(0);
163273a71a0fSBarry Smith }
163373a71a0fSBarry Smith 
163473a71a0fSBarry Smith #undef __FUNCT__
16354a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
163613f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
16370754003eSLois Curfman McInnes {
1638c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
16396849ba73SBarry Smith   PetscErrorCode ierr;
16405d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
16415d0c19d7SBarry Smith   const PetscInt *irow,*icol;
164287828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
16430754003eSLois Curfman McInnes   Mat            newmat;
16440754003eSLois Curfman McInnes 
16453a40ed3dSBarry Smith   PetscFunctionBegin;
164678b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
164778b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1648e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1649e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
16500754003eSLois Curfman McInnes 
1651182d2002SSatish Balay   /* Check submatrixcall */
1652182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
165313f74950SBarry Smith     PetscInt n_cols,n_rows;
1654182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
165521a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1656f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1657c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
165821a2c019SBarry Smith     }
1659182d2002SSatish Balay     newmat = *B;
1660182d2002SSatish Balay   } else {
16610754003eSLois Curfman McInnes     /* Create and fill new matrix */
1662ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1663f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
16647adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
16650298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1666182d2002SSatish Balay   }
1667182d2002SSatish Balay 
1668182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1669182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1670182d2002SSatish Balay 
1671182d2002SSatish Balay   for (i=0; i<ncols; i++) {
16726de62eeeSBarry Smith     av = v + mat->lda*icol[i];
16732205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
16740754003eSLois Curfman McInnes   }
1675182d2002SSatish Balay 
1676182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
16776d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
16786d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
16790754003eSLois Curfman McInnes 
16800754003eSLois Curfman McInnes   /* Free work space */
168178b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
168278b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1683182d2002SSatish Balay   *B   = newmat;
16843a40ed3dSBarry Smith   PetscFunctionReturn(0);
16850754003eSLois Curfman McInnes }
16860754003eSLois Curfman McInnes 
16874a2ae208SSatish Balay #undef __FUNCT__
16884a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
168913f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1690905e6a2fSBarry Smith {
16916849ba73SBarry Smith   PetscErrorCode ierr;
169213f74950SBarry Smith   PetscInt       i;
1693905e6a2fSBarry Smith 
16943a40ed3dSBarry Smith   PetscFunctionBegin;
1695905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1696854ce69bSBarry Smith     ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr);
1697905e6a2fSBarry Smith   }
1698905e6a2fSBarry Smith 
1699905e6a2fSBarry Smith   for (i=0; i<n; i++) {
17006a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1701905e6a2fSBarry Smith   }
17023a40ed3dSBarry Smith   PetscFunctionReturn(0);
1703905e6a2fSBarry Smith }
1704905e6a2fSBarry Smith 
17054a2ae208SSatish Balay #undef __FUNCT__
1706c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1707c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1708c0aa2d19SHong Zhang {
1709c0aa2d19SHong Zhang   PetscFunctionBegin;
1710c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1711c0aa2d19SHong Zhang }
1712c0aa2d19SHong Zhang 
1713c0aa2d19SHong Zhang #undef __FUNCT__
1714c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1715c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1716c0aa2d19SHong Zhang {
1717c0aa2d19SHong Zhang   PetscFunctionBegin;
1718c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1719c0aa2d19SHong Zhang }
1720c0aa2d19SHong Zhang 
1721c0aa2d19SHong Zhang #undef __FUNCT__
17224a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1723dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
17244b0e389bSBarry Smith {
17254b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
17266849ba73SBarry Smith   PetscErrorCode ierr;
1727d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
17283a40ed3dSBarry Smith 
17293a40ed3dSBarry Smith   PetscFunctionBegin;
173033f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
173133f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1732cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
17333a40ed3dSBarry Smith     PetscFunctionReturn(0);
17343a40ed3dSBarry Smith   }
1735e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1736a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
17370dbb7854Svictorle     for (j=0; j<n; j++) {
1738a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1739a5ce6ee0Svictorle     }
1740a5ce6ee0Svictorle   } else {
1741d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1742a5ce6ee0Svictorle   }
1743273d9f13SBarry Smith   PetscFunctionReturn(0);
1744273d9f13SBarry Smith }
1745273d9f13SBarry Smith 
17464a2ae208SSatish Balay #undef __FUNCT__
17474994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
17484994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A)
1749273d9f13SBarry Smith {
1750dfbe8321SBarry Smith   PetscErrorCode ierr;
1751273d9f13SBarry Smith 
1752273d9f13SBarry Smith   PetscFunctionBegin;
1753273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
17543a40ed3dSBarry Smith   PetscFunctionReturn(0);
17554b0e389bSBarry Smith }
17564b0e389bSBarry Smith 
1757284134d9SBarry Smith #undef __FUNCT__
1758ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1759ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1760ba337c44SJed Brown {
1761ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1762ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1763ba337c44SJed Brown   PetscScalar  *aa = a->v;
1764ba337c44SJed Brown 
1765ba337c44SJed Brown   PetscFunctionBegin;
1766ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1767ba337c44SJed Brown   PetscFunctionReturn(0);
1768ba337c44SJed Brown }
1769ba337c44SJed Brown 
1770ba337c44SJed Brown #undef __FUNCT__
1771ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1772ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1773ba337c44SJed Brown {
1774ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1775ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1776ba337c44SJed Brown   PetscScalar  *aa = a->v;
1777ba337c44SJed Brown 
1778ba337c44SJed Brown   PetscFunctionBegin;
1779ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1780ba337c44SJed Brown   PetscFunctionReturn(0);
1781ba337c44SJed Brown }
1782ba337c44SJed Brown 
1783ba337c44SJed Brown #undef __FUNCT__
1784ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1785ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1786ba337c44SJed Brown {
1787ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1788ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1789ba337c44SJed Brown   PetscScalar  *aa = a->v;
1790ba337c44SJed Brown 
1791ba337c44SJed Brown   PetscFunctionBegin;
1792ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1793ba337c44SJed Brown   PetscFunctionReturn(0);
1794ba337c44SJed Brown }
1795284134d9SBarry Smith 
1796a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1797a9fe9ddaSSatish Balay #undef __FUNCT__
1798a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1799a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1800a9fe9ddaSSatish Balay {
1801a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1802a9fe9ddaSSatish Balay 
1803a9fe9ddaSSatish Balay   PetscFunctionBegin;
1804a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
18053ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1806a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
18073ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1808a9fe9ddaSSatish Balay   }
18093ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1810a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
18113ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1812a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1813a9fe9ddaSSatish Balay }
1814a9fe9ddaSSatish Balay 
1815a9fe9ddaSSatish Balay #undef __FUNCT__
1816a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1817a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1818a9fe9ddaSSatish Balay {
1819ee16a9a1SHong Zhang   PetscErrorCode ierr;
1820d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1821ee16a9a1SHong Zhang   Mat            Cmat;
1822a9fe9ddaSSatish Balay 
1823ee16a9a1SHong Zhang   PetscFunctionBegin;
1824e32f2f54SBarry 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);
1825ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1826ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1827ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
18280298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1829d73949e8SHong Zhang 
1830ee16a9a1SHong Zhang   *C = Cmat;
1831ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1832ee16a9a1SHong Zhang }
1833a9fe9ddaSSatish Balay 
183498a3b096SSatish Balay #undef __FUNCT__
1835a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1836a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1837a9fe9ddaSSatish Balay {
1838a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1839a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1840a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
18410805154bSBarry Smith   PetscBLASInt   m,n,k;
1842a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1843c5df96a5SBarry Smith   PetscErrorCode ierr;
1844fd4e9aacSBarry Smith   PetscBool      flg;
1845a9fe9ddaSSatish Balay 
1846a9fe9ddaSSatish Balay   PetscFunctionBegin;
1847fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr);
1848fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense");
1849fd4e9aacSBarry Smith 
1850fd4e9aacSBarry Smith   /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/
1851fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr);
1852fd4e9aacSBarry Smith   if (flg) {
1853fd4e9aacSBarry Smith     C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense;
1854fd4e9aacSBarry Smith     ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr);
1855fd4e9aacSBarry Smith     PetscFunctionReturn(0);
1856fd4e9aacSBarry Smith   }
1857fd4e9aacSBarry Smith 
1858fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr);
1859fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense");
1860c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1861c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1862c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
18635ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1864a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1865a9fe9ddaSSatish Balay }
1866a9fe9ddaSSatish Balay 
1867a9fe9ddaSSatish Balay #undef __FUNCT__
186875648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
186975648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1870a9fe9ddaSSatish Balay {
1871a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1872a9fe9ddaSSatish Balay 
1873a9fe9ddaSSatish Balay   PetscFunctionBegin;
1874a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
18753ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
187675648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
18773ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1878a9fe9ddaSSatish Balay   }
18793ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
188075648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
18813ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1882a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1883a9fe9ddaSSatish Balay }
1884a9fe9ddaSSatish Balay 
1885a9fe9ddaSSatish Balay #undef __FUNCT__
188675648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
188775648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1888a9fe9ddaSSatish Balay {
1889ee16a9a1SHong Zhang   PetscErrorCode ierr;
1890d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1891ee16a9a1SHong Zhang   Mat            Cmat;
1892a9fe9ddaSSatish Balay 
1893ee16a9a1SHong Zhang   PetscFunctionBegin;
1894e32f2f54SBarry 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);
1895ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1896ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1897ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
18980298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
18992205254eSKarl Rupp 
1900ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
19012205254eSKarl Rupp 
1902ee16a9a1SHong Zhang   *C = Cmat;
1903ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1904ee16a9a1SHong Zhang }
1905a9fe9ddaSSatish Balay 
1906a9fe9ddaSSatish Balay #undef __FUNCT__
190775648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
190875648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1909a9fe9ddaSSatish Balay {
1910a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1911a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1912a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
19130805154bSBarry Smith   PetscBLASInt   m,n,k;
1914a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1915c5df96a5SBarry Smith   PetscErrorCode ierr;
1916a9fe9ddaSSatish Balay 
1917a9fe9ddaSSatish Balay   PetscFunctionBegin;
1918c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1919c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1920c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
19212fbe02b9SBarry Smith   /*
19222fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
19232fbe02b9SBarry Smith   */
19245ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1925a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1926a9fe9ddaSSatish Balay }
1927985db425SBarry Smith 
1928985db425SBarry Smith #undef __FUNCT__
1929985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1930985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1931985db425SBarry Smith {
1932985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1933985db425SBarry Smith   PetscErrorCode ierr;
1934d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1935985db425SBarry Smith   PetscScalar    *x;
1936985db425SBarry Smith   MatScalar      *aa = a->v;
1937985db425SBarry Smith 
1938985db425SBarry Smith   PetscFunctionBegin;
1939e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1940985db425SBarry Smith 
1941985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1942985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1943985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1944e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1945985db425SBarry Smith   for (i=0; i<m; i++) {
1946985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1947985db425SBarry Smith     for (j=1; j<n; j++) {
1948985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1949985db425SBarry Smith     }
1950985db425SBarry Smith   }
1951985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1952985db425SBarry Smith   PetscFunctionReturn(0);
1953985db425SBarry Smith }
1954985db425SBarry Smith 
1955985db425SBarry Smith #undef __FUNCT__
1956985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1957985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1958985db425SBarry Smith {
1959985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1960985db425SBarry Smith   PetscErrorCode ierr;
1961d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1962985db425SBarry Smith   PetscScalar    *x;
1963985db425SBarry Smith   PetscReal      atmp;
1964985db425SBarry Smith   MatScalar      *aa = a->v;
1965985db425SBarry Smith 
1966985db425SBarry Smith   PetscFunctionBegin;
1967e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1968985db425SBarry Smith 
1969985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1970985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1971985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1972e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1973985db425SBarry Smith   for (i=0; i<m; i++) {
19749189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1975985db425SBarry Smith     for (j=1; j<n; j++) {
1976985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1977985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1978985db425SBarry Smith     }
1979985db425SBarry Smith   }
1980985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1981985db425SBarry Smith   PetscFunctionReturn(0);
1982985db425SBarry Smith }
1983985db425SBarry Smith 
1984985db425SBarry Smith #undef __FUNCT__
1985985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1986985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1987985db425SBarry Smith {
1988985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1989985db425SBarry Smith   PetscErrorCode ierr;
1990d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1991985db425SBarry Smith   PetscScalar    *x;
1992985db425SBarry Smith   MatScalar      *aa = a->v;
1993985db425SBarry Smith 
1994985db425SBarry Smith   PetscFunctionBegin;
1995e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1996985db425SBarry Smith 
1997985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1998985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1999985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
2000e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
2001985db425SBarry Smith   for (i=0; i<m; i++) {
2002985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
2003985db425SBarry Smith     for (j=1; j<n; j++) {
2004985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
2005985db425SBarry Smith     }
2006985db425SBarry Smith   }
2007985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2008985db425SBarry Smith   PetscFunctionReturn(0);
2009985db425SBarry Smith }
2010985db425SBarry Smith 
20118d0534beSBarry Smith #undef __FUNCT__
20128d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
20138d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
20148d0534beSBarry Smith {
20158d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
20168d0534beSBarry Smith   PetscErrorCode ierr;
20178d0534beSBarry Smith   PetscScalar    *x;
20188d0534beSBarry Smith 
20198d0534beSBarry Smith   PetscFunctionBegin;
2020e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
20218d0534beSBarry Smith 
20228d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2023d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
20248d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
20258d0534beSBarry Smith   PetscFunctionReturn(0);
20268d0534beSBarry Smith }
20278d0534beSBarry Smith 
20280716a85fSBarry Smith 
20290716a85fSBarry Smith #undef __FUNCT__
20300716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
20310716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
20320716a85fSBarry Smith {
20330716a85fSBarry Smith   PetscErrorCode ierr;
20340716a85fSBarry Smith   PetscInt       i,j,m,n;
20350716a85fSBarry Smith   PetscScalar    *a;
20360716a85fSBarry Smith 
20370716a85fSBarry Smith   PetscFunctionBegin;
20380716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
20390716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
20408c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
20410716a85fSBarry Smith   if (type == NORM_2) {
20420716a85fSBarry Smith     for (i=0; i<n; i++) {
20430716a85fSBarry Smith       for (j=0; j<m; j++) {
20440716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
20450716a85fSBarry Smith       }
20460716a85fSBarry Smith       a += m;
20470716a85fSBarry Smith     }
20480716a85fSBarry Smith   } else if (type == NORM_1) {
20490716a85fSBarry Smith     for (i=0; i<n; i++) {
20500716a85fSBarry Smith       for (j=0; j<m; j++) {
20510716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
20520716a85fSBarry Smith       }
20530716a85fSBarry Smith       a += m;
20540716a85fSBarry Smith     }
20550716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
20560716a85fSBarry Smith     for (i=0; i<n; i++) {
20570716a85fSBarry Smith       for (j=0; j<m; j++) {
20580716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
20590716a85fSBarry Smith       }
20600716a85fSBarry Smith       a += m;
20610716a85fSBarry Smith     }
2062ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
20638c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
20640716a85fSBarry Smith   if (type == NORM_2) {
20658f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
20660716a85fSBarry Smith   }
20670716a85fSBarry Smith   PetscFunctionReturn(0);
20680716a85fSBarry Smith }
20690716a85fSBarry Smith 
207073a71a0fSBarry Smith #undef __FUNCT__
207173a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
207273a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
207373a71a0fSBarry Smith {
207473a71a0fSBarry Smith   PetscErrorCode ierr;
207573a71a0fSBarry Smith   PetscScalar    *a;
207673a71a0fSBarry Smith   PetscInt       m,n,i;
207773a71a0fSBarry Smith 
207873a71a0fSBarry Smith   PetscFunctionBegin;
207973a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
20808c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
208173a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
208273a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
208373a71a0fSBarry Smith   }
20848c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
208573a71a0fSBarry Smith   PetscFunctionReturn(0);
208673a71a0fSBarry Smith }
208773a71a0fSBarry Smith 
20883b49f96aSBarry Smith #undef __FUNCT__
20893b49f96aSBarry Smith #define __FUNCT__ "MatMissingDiagonal_SeqDense"
20903b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool  *missing,PetscInt *d)
20913b49f96aSBarry Smith {
20923b49f96aSBarry Smith   PetscFunctionBegin;
20933b49f96aSBarry Smith   *missing = PETSC_FALSE;
20943b49f96aSBarry Smith   PetscFunctionReturn(0);
20953b49f96aSBarry Smith }
209673a71a0fSBarry Smith 
2097abc3b08eSStefano Zampini 
2098289bc588SBarry Smith /* -------------------------------------------------------------------*/
2099a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
2100905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
2101905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
2102905e6a2fSBarry Smith                                         MatMult_SeqDense,
210397304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
21047c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
21057c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
2106db4efbfdSBarry Smith                                         0,
2107db4efbfdSBarry Smith                                         0,
2108db4efbfdSBarry Smith                                         0,
2109db4efbfdSBarry Smith                                 /* 10*/ 0,
2110905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
2111905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
211241f059aeSBarry Smith                                         MatSOR_SeqDense,
2113ec8511deSBarry Smith                                         MatTranspose_SeqDense,
211497304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
2115905e6a2fSBarry Smith                                         MatEqual_SeqDense,
2116905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
2117905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
2118905e6a2fSBarry Smith                                         MatNorm_SeqDense,
2119c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
2120c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
2121905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
2122905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
2123d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
2124db4efbfdSBarry Smith                                         0,
2125db4efbfdSBarry Smith                                         0,
2126db4efbfdSBarry Smith                                         0,
2127db4efbfdSBarry Smith                                         0,
21284994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2129273d9f13SBarry Smith                                         0,
2130905e6a2fSBarry Smith                                         0,
213173a71a0fSBarry Smith                                         0,
213273a71a0fSBarry Smith                                         0,
2133d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2134a5ae1ecdSBarry Smith                                         0,
2135a5ae1ecdSBarry Smith                                         0,
2136a5ae1ecdSBarry Smith                                         0,
2137a5ae1ecdSBarry Smith                                         0,
2138d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
2139a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
2140a5ae1ecdSBarry Smith                                         0,
21414b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2142a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2143d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2144a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
21457d68702bSBarry Smith                                         MatShift_Basic,
2146a5ae1ecdSBarry Smith                                         0,
2147a5ae1ecdSBarry Smith                                         0,
214873a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2149a5ae1ecdSBarry Smith                                         0,
2150a5ae1ecdSBarry Smith                                         0,
2151a5ae1ecdSBarry Smith                                         0,
2152a5ae1ecdSBarry Smith                                         0,
2153d519adbfSMatthew Knepley                                 /* 54*/ 0,
2154a5ae1ecdSBarry Smith                                         0,
2155a5ae1ecdSBarry Smith                                         0,
2156a5ae1ecdSBarry Smith                                         0,
2157a5ae1ecdSBarry Smith                                         0,
2158d519adbfSMatthew Knepley                                 /* 59*/ 0,
2159e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2160e03a110bSBarry Smith                                         MatView_SeqDense,
2161357abbc8SBarry Smith                                         0,
216297304618SKris Buschelman                                         0,
2163d519adbfSMatthew Knepley                                 /* 64*/ 0,
216497304618SKris Buschelman                                         0,
216597304618SKris Buschelman                                         0,
216697304618SKris Buschelman                                         0,
216797304618SKris Buschelman                                         0,
2168d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
216997304618SKris Buschelman                                         0,
217097304618SKris Buschelman                                         0,
217197304618SKris Buschelman                                         0,
217297304618SKris Buschelman                                         0,
2173d519adbfSMatthew Knepley                                 /* 74*/ 0,
217497304618SKris Buschelman                                         0,
217597304618SKris Buschelman                                         0,
217697304618SKris Buschelman                                         0,
217797304618SKris Buschelman                                         0,
2178d519adbfSMatthew Knepley                                 /* 79*/ 0,
217997304618SKris Buschelman                                         0,
218097304618SKris Buschelman                                         0,
218197304618SKris Buschelman                                         0,
21825bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2183865e5f61SKris Buschelman                                         0,
21841cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2185865e5f61SKris Buschelman                                         0,
2186865e5f61SKris Buschelman                                         0,
2187865e5f61SKris Buschelman                                         0,
2188d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2189a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2190a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2191abc3b08eSStefano Zampini                                         MatPtAP_SeqDense_SeqDense,
2192abc3b08eSStefano Zampini                                         MatPtAPSymbolic_SeqDense_SeqDense,
2193abc3b08eSStefano Zampini                                 /* 94*/ MatPtAPNumeric_SeqDense_SeqDense,
21945df89d91SHong Zhang                                         0,
21955df89d91SHong Zhang                                         0,
21965df89d91SHong Zhang                                         0,
2197284134d9SBarry Smith                                         0,
2198d519adbfSMatthew Knepley                                 /* 99*/ 0,
2199284134d9SBarry Smith                                         0,
2200284134d9SBarry Smith                                         0,
2201ba337c44SJed Brown                                         MatConjugate_SeqDense,
2202f73d5cc4SBarry Smith                                         0,
2203ba337c44SJed Brown                                 /*104*/ 0,
2204ba337c44SJed Brown                                         MatRealPart_SeqDense,
2205ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2206985db425SBarry Smith                                         0,
2207985db425SBarry Smith                                         0,
220885e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2209985db425SBarry Smith                                         0,
22108d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2211aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
22123b49f96aSBarry Smith                                         MatMissingDiagonal_SeqDense,
2213aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2214aabbc4fbSShri Abhyankar                                         0,
2215aabbc4fbSShri Abhyankar                                         0,
2216aabbc4fbSShri Abhyankar                                         0,
2217aabbc4fbSShri Abhyankar                                         0,
2218aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2219aabbc4fbSShri Abhyankar                                         0,
2220aabbc4fbSShri Abhyankar                                         0,
22210716a85fSBarry Smith                                         0,
22220716a85fSBarry Smith                                         0,
22230716a85fSBarry Smith                                 /*124*/ 0,
22245df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
22255df89d91SHong Zhang                                         0,
22265df89d91SHong Zhang                                         0,
22275df89d91SHong Zhang                                         0,
22285df89d91SHong Zhang                                 /*129*/ 0,
222975648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
223075648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
223175648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
22323964eb88SJed Brown                                         0,
22333964eb88SJed Brown                                 /*134*/ 0,
22343964eb88SJed Brown                                         0,
22353964eb88SJed Brown                                         0,
22363964eb88SJed Brown                                         0,
22373964eb88SJed Brown                                         0,
22383964eb88SJed Brown                                 /*139*/ 0,
2239f9426fe0SMark Adams                                         0,
22403964eb88SJed Brown                                         0
2241985db425SBarry Smith };
224290ace30eSBarry Smith 
22434a2ae208SSatish Balay #undef __FUNCT__
22444a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
22454b828684SBarry Smith /*@C
2246fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2247d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2248d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2249289bc588SBarry Smith 
2250db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2251db81eaa0SLois Curfman McInnes 
225220563c6bSBarry Smith    Input Parameters:
2253db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
22540c775827SLois Curfman McInnes .  m - number of rows
225518f449edSLois Curfman McInnes .  n - number of columns
22560298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2257dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
225820563c6bSBarry Smith 
225920563c6bSBarry Smith    Output Parameter:
226044cd7ae7SLois Curfman McInnes .  A - the matrix
226120563c6bSBarry Smith 
2262b259b22eSLois Curfman McInnes    Notes:
226318f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
226418f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
22650298fd71SBarry Smith    set data=NULL.
226618f449edSLois Curfman McInnes 
2267027ccd11SLois Curfman McInnes    Level: intermediate
2268027ccd11SLois Curfman McInnes 
2269dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2270d65003e9SLois Curfman McInnes 
227169b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
227220563c6bSBarry Smith @*/
22737087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2274289bc588SBarry Smith {
2275dfbe8321SBarry Smith   PetscErrorCode ierr;
22763b2fbd54SBarry Smith 
22773a40ed3dSBarry Smith   PetscFunctionBegin;
2278f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2279f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2280273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2281273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2282273d9f13SBarry Smith   PetscFunctionReturn(0);
2283273d9f13SBarry Smith }
2284273d9f13SBarry Smith 
22854a2ae208SSatish Balay #undef __FUNCT__
2286afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2287273d9f13SBarry Smith /*@C
2288273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2289273d9f13SBarry Smith 
2290273d9f13SBarry Smith    Collective on MPI_Comm
2291273d9f13SBarry Smith 
2292273d9f13SBarry Smith    Input Parameters:
22931c4f3114SJed Brown +  B - the matrix
22940298fd71SBarry Smith -  data - the array (or NULL)
2295273d9f13SBarry Smith 
2296273d9f13SBarry Smith    Notes:
2297273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2298273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2299284134d9SBarry Smith    need not call this routine.
2300273d9f13SBarry Smith 
2301273d9f13SBarry Smith    Level: intermediate
2302273d9f13SBarry Smith 
2303273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2304273d9f13SBarry Smith 
230569b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2306867c911aSBarry Smith 
2307273d9f13SBarry Smith @*/
23087087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2309273d9f13SBarry Smith {
23104ac538c5SBarry Smith   PetscErrorCode ierr;
2311a23d5eceSKris Buschelman 
2312a23d5eceSKris Buschelman   PetscFunctionBegin;
23134ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2314a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2315a23d5eceSKris Buschelman }
2316a23d5eceSKris Buschelman 
2317a23d5eceSKris Buschelman #undef __FUNCT__
2318afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
23197087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2320a23d5eceSKris Buschelman {
2321273d9f13SBarry Smith   Mat_SeqDense   *b;
2322dfbe8321SBarry Smith   PetscErrorCode ierr;
2323273d9f13SBarry Smith 
2324273d9f13SBarry Smith   PetscFunctionBegin;
2325273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2326a868139aSShri Abhyankar 
232734ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
232834ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
232934ef9618SShri Abhyankar 
2330273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
233186d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
233286d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
233386d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
233486d161a7SShri Abhyankar 
23359e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
23369e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2337e92229d0SSatish Balay     ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr);
23383bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
23392205254eSKarl Rupp 
23409e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2341273d9f13SBarry Smith   } else { /* user-allocated storage */
23429e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2343273d9f13SBarry Smith     b->v          = data;
2344273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2345273d9f13SBarry Smith   }
23460450473dSBarry Smith   B->assembled = PETSC_TRUE;
2347273d9f13SBarry Smith   PetscFunctionReturn(0);
2348273d9f13SBarry Smith }
2349273d9f13SBarry Smith 
235065b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
23511b807ce4Svictorle #undef __FUNCT__
23528baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental"
23538baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
23548baccfbdSHong Zhang {
2355d77f618aSHong Zhang   Mat            mat_elemental;
2356d77f618aSHong Zhang   PetscErrorCode ierr;
2357d77f618aSHong Zhang   PetscScalar    *array,*v_colwise;
2358d77f618aSHong Zhang   PetscInt       M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
2359d77f618aSHong Zhang 
23608baccfbdSHong Zhang   PetscFunctionBegin;
2361d77f618aSHong Zhang   ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr);
2362d77f618aSHong Zhang   ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr);
2363d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
2364d77f618aSHong Zhang   k = 0;
2365d77f618aSHong Zhang   for (j=0; j<N; j++) {
2366d77f618aSHong Zhang     cols[j] = j;
2367d77f618aSHong Zhang     for (i=0; i<M; i++) {
2368d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
2369d77f618aSHong Zhang     }
2370d77f618aSHong Zhang   }
2371d77f618aSHong Zhang   for (i=0; i<M; i++) {
2372d77f618aSHong Zhang     rows[i] = i;
2373d77f618aSHong Zhang   }
2374d77f618aSHong Zhang   ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr);
2375d77f618aSHong Zhang 
2376d77f618aSHong Zhang   ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr);
2377d77f618aSHong Zhang   ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
2378d77f618aSHong Zhang   ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr);
2379d77f618aSHong Zhang   ierr = MatSetUp(mat_elemental);CHKERRQ(ierr);
2380d77f618aSHong Zhang 
2381d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
2382d77f618aSHong Zhang   ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr);
2383d77f618aSHong Zhang   ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2384d77f618aSHong Zhang   ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2385d77f618aSHong Zhang   ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr);
2386d77f618aSHong Zhang 
2387511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
238828be2f97SBarry Smith     ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr);
2389d77f618aSHong Zhang   } else {
2390d77f618aSHong Zhang     *newmat = mat_elemental;
2391d77f618aSHong Zhang   }
23928baccfbdSHong Zhang   PetscFunctionReturn(0);
23938baccfbdSHong Zhang }
239465b80a83SHong Zhang #endif
23958baccfbdSHong Zhang 
23968baccfbdSHong Zhang #undef __FUNCT__
23971b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
23981b807ce4Svictorle /*@C
23991b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
24001b807ce4Svictorle 
24011b807ce4Svictorle   Input parameter:
24021b807ce4Svictorle + A - the matrix
24031b807ce4Svictorle - lda - the leading dimension
24041b807ce4Svictorle 
24051b807ce4Svictorle   Notes:
2406867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
24071b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
24081b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
24091b807ce4Svictorle 
24101b807ce4Svictorle   Level: intermediate
24111b807ce4Svictorle 
24121b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
24131b807ce4Svictorle 
2414284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2415867c911aSBarry Smith 
24161b807ce4Svictorle @*/
24177087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
24181b807ce4Svictorle {
24191b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
242021a2c019SBarry Smith 
24211b807ce4Svictorle   PetscFunctionBegin;
2422e32f2f54SBarry 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);
24231b807ce4Svictorle   b->lda       = lda;
242421a2c019SBarry Smith   b->changelda = PETSC_FALSE;
242521a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
24261b807ce4Svictorle   PetscFunctionReturn(0);
24271b807ce4Svictorle }
24281b807ce4Svictorle 
24290bad9183SKris Buschelman /*MC
2430fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
24310bad9183SKris Buschelman 
24320bad9183SKris Buschelman    Options Database Keys:
24330bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
24340bad9183SKris Buschelman 
24350bad9183SKris Buschelman   Level: beginner
24360bad9183SKris Buschelman 
243789665df3SBarry Smith .seealso: MatCreateSeqDense()
243889665df3SBarry Smith 
24390bad9183SKris Buschelman M*/
24400bad9183SKris Buschelman 
24414a2ae208SSatish Balay #undef __FUNCT__
24424a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
24438cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B)
2444273d9f13SBarry Smith {
2445273d9f13SBarry Smith   Mat_SeqDense   *b;
2446dfbe8321SBarry Smith   PetscErrorCode ierr;
24477c334f02SBarry Smith   PetscMPIInt    size;
2448273d9f13SBarry Smith 
2449273d9f13SBarry Smith   PetscFunctionBegin;
2450ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2451e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
245255659b69SBarry Smith 
2453b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
2454549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
245544cd7ae7SLois Curfman McInnes   B->data = (void*)b;
245618f449edSLois Curfman McInnes 
245744cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2458273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2459273d9f13SBarry Smith   b->v           = 0;
246021a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
24614e220ebcSLois Curfman McInnes 
2462bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
2463bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2464bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
24658baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
24668baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
24678baccfbdSHong Zhang #endif
2468bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
2469bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
2470bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
2471bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
2472abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr);
24733bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
24743bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
24753bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
247617667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
24773a40ed3dSBarry Smith   PetscFunctionReturn(0);
2478289bc588SBarry Smith }
2479