xref: /petsc/src/mat/impls/dense/seq/dense.c (revision abc3b08ea96a1ec1fce68b6dd23e12ba18b3f617)
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__
12*abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAPNumeric_SeqDense_SeqDense"
13*abc3b08eSStefano Zampini PetscErrorCode MatPtAPNumeric_SeqDense_SeqDense(Mat A,Mat P,Mat C)
14*abc3b08eSStefano Zampini {
15*abc3b08eSStefano Zampini   Mat_SeqDense   *c = (Mat_SeqDense*)(C->data);
16*abc3b08eSStefano Zampini   PetscErrorCode ierr;
17*abc3b08eSStefano Zampini 
18*abc3b08eSStefano Zampini   PetscFunctionBegin;
19*abc3b08eSStefano Zampini   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,P,c->ptapwork);CHKERRQ(ierr);
20*abc3b08eSStefano Zampini   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(P,c->ptapwork,C);CHKERRQ(ierr);
21*abc3b08eSStefano Zampini   PetscFunctionReturn(0);
22*abc3b08eSStefano Zampini }
23*abc3b08eSStefano Zampini 
24*abc3b08eSStefano Zampini #undef __FUNCT__
25*abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAPSymbolic_SeqDense_SeqDense"
26*abc3b08eSStefano Zampini PetscErrorCode MatPtAPSymbolic_SeqDense_SeqDense(Mat A,Mat P,PetscReal fill,Mat *C)
27*abc3b08eSStefano Zampini {
28*abc3b08eSStefano Zampini   Mat_SeqDense   *c;
29*abc3b08eSStefano Zampini   PetscErrorCode ierr;
30*abc3b08eSStefano Zampini 
31*abc3b08eSStefano Zampini   PetscFunctionBegin;
32*abc3b08eSStefano Zampini   ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),P->cmap->N,P->cmap->N,NULL,C);CHKERRQ(ierr);
33*abc3b08eSStefano Zampini   c = (Mat_SeqDense*)((*C)->data);
34*abc3b08eSStefano Zampini   ierr = MatCreateSeqDense(PetscObjectComm((PetscObject)A),A->rmap->N,P->cmap->N,NULL,&c->ptapwork);CHKERRQ(ierr);
35*abc3b08eSStefano Zampini   PetscFunctionReturn(0);
36*abc3b08eSStefano Zampini }
37*abc3b08eSStefano Zampini 
38*abc3b08eSStefano Zampini #undef __FUNCT__
39*abc3b08eSStefano Zampini #define __FUNCT__ "MatPtAP_SeqDense_SeqDense"
40*abc3b08eSStefano Zampini PETSC_EXTERN PetscErrorCode MatPtAP_SeqDense_SeqDense(Mat A,Mat P,MatReuse reuse,PetscReal fill,Mat *C)
41*abc3b08eSStefano Zampini {
42*abc3b08eSStefano Zampini   PetscErrorCode ierr;
43*abc3b08eSStefano Zampini 
44*abc3b08eSStefano Zampini   PetscFunctionBegin;
45*abc3b08eSStefano Zampini   if (reuse == MAT_INITIAL_MATRIX) {
46*abc3b08eSStefano Zampini     ierr = MatPtAPSymbolic_SeqDense_SeqDense(A,P,fill,C);CHKERRQ(ierr);
47*abc3b08eSStefano Zampini   } else {
48*abc3b08eSStefano Zampini     if (P == *C) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_SUP,"Cannot compute PtAP operation with P == *C");
49*abc3b08eSStefano Zampini   }
50*abc3b08eSStefano Zampini   ierr = PetscLogEventBegin(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr);
51*abc3b08eSStefano Zampini   ierr = (*(*C)->ops->ptapnumeric)(A,P,*C);CHKERRQ(ierr);
52*abc3b08eSStefano Zampini   ierr = PetscLogEventEnd(MAT_PtAPNumeric,A,P,0,0);CHKERRQ(ierr);
53*abc3b08eSStefano Zampini   PetscFunctionReturn(0);
54*abc3b08eSStefano Zampini }
55*abc3b08eSStefano Zampini 
56*abc3b08eSStefano Zampini #undef __FUNCT__
57b49cda9fSStefano Zampini #define __FUNCT__ "MatConvert_SeqAIJ_SeqDense"
58b49cda9fSStefano Zampini PETSC_EXTERN PetscErrorCode MatConvert_SeqAIJ_SeqDense(Mat A,MatType newtype,MatReuse reuse,Mat *newmat)
59b49cda9fSStefano Zampini {
60b49cda9fSStefano Zampini   Mat            B;
61b49cda9fSStefano Zampini   Mat_SeqAIJ     *a = (Mat_SeqAIJ*)A->data;
62b49cda9fSStefano Zampini   Mat_SeqDense   *b;
63b49cda9fSStefano Zampini   PetscErrorCode ierr;
64b49cda9fSStefano Zampini   PetscInt       *ai=a->i,*aj=a->j,m=A->rmap->N,n=A->cmap->N,i;
65b49cda9fSStefano Zampini   MatScalar      *av=a->a;
66b49cda9fSStefano Zampini 
67b49cda9fSStefano Zampini   PetscFunctionBegin;
68b49cda9fSStefano Zampini   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
69b49cda9fSStefano Zampini   ierr = MatSetSizes(B,m,n,m,n);CHKERRQ(ierr);
70b49cda9fSStefano Zampini   ierr = MatSetType(B,MATSEQDENSE);CHKERRQ(ierr);
71b49cda9fSStefano Zampini   ierr = MatSeqDenseSetPreallocation(B,NULL);CHKERRQ(ierr);
72b49cda9fSStefano Zampini 
73b49cda9fSStefano Zampini   b  = (Mat_SeqDense*)(B->data);
74b49cda9fSStefano Zampini   for (i=0; i<m; i++) {
75b49cda9fSStefano Zampini     PetscInt j;
76b49cda9fSStefano Zampini     for (j=0;j<ai[1]-ai[0];j++) {
77b49cda9fSStefano Zampini       b->v[*aj*m+i] = *av;
78b49cda9fSStefano Zampini       aj++;
79b49cda9fSStefano Zampini       av++;
80b49cda9fSStefano Zampini     }
81b49cda9fSStefano Zampini     ai++;
82b49cda9fSStefano Zampini   }
83b49cda9fSStefano Zampini   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
84b49cda9fSStefano Zampini   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
85b49cda9fSStefano Zampini 
86511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
8728be2f97SBarry Smith     ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr);
88b49cda9fSStefano Zampini   } else {
89b49cda9fSStefano Zampini     *newmat = B;
90b49cda9fSStefano Zampini   }
91b49cda9fSStefano Zampini   PetscFunctionReturn(0);
92b49cda9fSStefano Zampini }
93b49cda9fSStefano Zampini 
94b49cda9fSStefano Zampini #undef __FUNCT__
956a63e612SBarry Smith #define __FUNCT__ "MatConvert_SeqDense_SeqAIJ"
968cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_SeqAIJ(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
976a63e612SBarry Smith {
986a63e612SBarry Smith   Mat            B;
996a63e612SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1006a63e612SBarry Smith   PetscErrorCode ierr;
1019399e1b8SMatthew G. Knepley   PetscInt       i, j;
1029399e1b8SMatthew G. Knepley   PetscInt       *rows, *nnz;
1039399e1b8SMatthew G. Knepley   MatScalar      *aa = a->v, *vals;
1046a63e612SBarry Smith 
1056a63e612SBarry Smith   PetscFunctionBegin;
106ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),&B);CHKERRQ(ierr);
1076a63e612SBarry Smith   ierr = MatSetSizes(B,A->rmap->n,A->cmap->n,A->rmap->N,A->cmap->N);CHKERRQ(ierr);
1086a63e612SBarry Smith   ierr = MatSetType(B,MATSEQAIJ);CHKERRQ(ierr);
1099399e1b8SMatthew G. Knepley   ierr = PetscCalloc3(A->rmap->n,&rows,A->rmap->n,&nnz,A->rmap->n,&vals);CHKERRQ(ierr);
1109399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
1119399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) ++nnz[i];
1126a63e612SBarry Smith     aa += a->lda;
1136a63e612SBarry Smith   }
1149399e1b8SMatthew G. Knepley   ierr = MatSeqAIJSetPreallocation(B,PETSC_DETERMINE,nnz);CHKERRQ(ierr);
1159399e1b8SMatthew G. Knepley   aa = a->v;
1169399e1b8SMatthew G. Knepley   for (j=0; j<A->cmap->n; j++) {
1179399e1b8SMatthew G. Knepley     PetscInt numRows = 0;
1189399e1b8SMatthew G. Knepley     for (i=0; i<A->rmap->n; i++) if (aa[i] != 0.0 || i == j) {rows[numRows] = i; vals[numRows++] = aa[i];}
1199399e1b8SMatthew G. Knepley     ierr = MatSetValues(B,numRows,rows,1,&j,vals,INSERT_VALUES);CHKERRQ(ierr);
1209399e1b8SMatthew G. Knepley     aa  += a->lda;
1219399e1b8SMatthew G. Knepley   }
1229399e1b8SMatthew G. Knepley   ierr = PetscFree3(rows,nnz,vals);CHKERRQ(ierr);
1236a63e612SBarry Smith   ierr = MatAssemblyBegin(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1246a63e612SBarry Smith   ierr = MatAssemblyEnd(B,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1256a63e612SBarry Smith 
126511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
12728be2f97SBarry Smith     ierr = MatHeaderReplace(A,&B);CHKERRQ(ierr);
1286a63e612SBarry Smith   } else {
1296a63e612SBarry Smith     *newmat = B;
1306a63e612SBarry Smith   }
1316a63e612SBarry Smith   PetscFunctionReturn(0);
1326a63e612SBarry Smith }
1336a63e612SBarry Smith 
1344a2ae208SSatish Balay #undef __FUNCT__
1354a2ae208SSatish Balay #define __FUNCT__ "MatAXPY_SeqDense"
136f4df32b1SMatthew Knepley PetscErrorCode MatAXPY_SeqDense(Mat Y,PetscScalar alpha,Mat X,MatStructure str)
1371987afe7SBarry Smith {
1381987afe7SBarry Smith   Mat_SeqDense   *x     = (Mat_SeqDense*)X->data,*y = (Mat_SeqDense*)Y->data;
139f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
14013f74950SBarry Smith   PetscInt       j;
1410805154bSBarry Smith   PetscBLASInt   N,m,ldax,lday,one = 1;
142efee365bSSatish Balay   PetscErrorCode ierr;
1433a40ed3dSBarry Smith 
1443a40ed3dSBarry Smith   PetscFunctionBegin;
145c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n*X->cmap->n,&N);CHKERRQ(ierr);
146c5df96a5SBarry Smith   ierr = PetscBLASIntCast(X->rmap->n,&m);CHKERRQ(ierr);
147c5df96a5SBarry Smith   ierr = PetscBLASIntCast(x->lda,&ldax);CHKERRQ(ierr);
148c5df96a5SBarry Smith   ierr = PetscBLASIntCast(y->lda,&lday);CHKERRQ(ierr);
149a5ce6ee0Svictorle   if (ldax>m || lday>m) {
150d0f46423SBarry Smith     for (j=0; j<X->cmap->n; j++) {
1518b83055fSJed Brown       PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&m,&oalpha,x->v+j*ldax,&one,y->v+j*lday,&one));
152a5ce6ee0Svictorle     }
153a5ce6ee0Svictorle   } else {
1548b83055fSJed Brown     PetscStackCallBLAS("BLASaxpy",BLASaxpy_(&N,&oalpha,x->v,&one,y->v,&one));
155a5ce6ee0Svictorle   }
156a3fa217bSJose E. Roman   ierr = PetscObjectStateIncrease((PetscObject)Y);CHKERRQ(ierr);
1570450473dSBarry Smith   ierr = PetscLogFlops(PetscMax(2*N-1,0));CHKERRQ(ierr);
1583a40ed3dSBarry Smith   PetscFunctionReturn(0);
1591987afe7SBarry Smith }
1601987afe7SBarry Smith 
1614a2ae208SSatish Balay #undef __FUNCT__
1624a2ae208SSatish Balay #define __FUNCT__ "MatGetInfo_SeqDense"
163dfbe8321SBarry Smith PetscErrorCode MatGetInfo_SeqDense(Mat A,MatInfoType flag,MatInfo *info)
164289bc588SBarry Smith {
165d0f46423SBarry Smith   PetscInt N = A->rmap->n*A->cmap->n;
1663a40ed3dSBarry Smith 
1673a40ed3dSBarry Smith   PetscFunctionBegin;
1684e220ebcSLois Curfman McInnes   info->block_size        = 1.0;
1694e220ebcSLois Curfman McInnes   info->nz_allocated      = (double)N;
1706de62eeeSBarry Smith   info->nz_used           = (double)N;
1716de62eeeSBarry Smith   info->nz_unneeded       = (double)0;
1724e220ebcSLois Curfman McInnes   info->assemblies        = (double)A->num_ass;
1734e220ebcSLois Curfman McInnes   info->mallocs           = 0;
1747adad957SLisandro Dalcin   info->memory            = ((PetscObject)A)->mem;
1754e220ebcSLois Curfman McInnes   info->fill_ratio_given  = 0;
1764e220ebcSLois Curfman McInnes   info->fill_ratio_needed = 0;
1774e220ebcSLois Curfman McInnes   info->factor_mallocs    = 0;
1783a40ed3dSBarry Smith   PetscFunctionReturn(0);
179289bc588SBarry Smith }
180289bc588SBarry Smith 
1814a2ae208SSatish Balay #undef __FUNCT__
1824a2ae208SSatish Balay #define __FUNCT__ "MatScale_SeqDense"
183f4df32b1SMatthew Knepley PetscErrorCode MatScale_SeqDense(Mat A,PetscScalar alpha)
18480cd9d93SLois Curfman McInnes {
185273d9f13SBarry Smith   Mat_SeqDense   *a     = (Mat_SeqDense*)A->data;
186f4df32b1SMatthew Knepley   PetscScalar    oalpha = alpha;
187efee365bSSatish Balay   PetscErrorCode ierr;
188c5df96a5SBarry Smith   PetscBLASInt   one = 1,j,nz,lda;
18980cd9d93SLois Curfman McInnes 
1903a40ed3dSBarry Smith   PetscFunctionBegin;
191c5df96a5SBarry Smith   ierr = PetscBLASIntCast(a->lda,&lda);CHKERRQ(ierr);
192d0f46423SBarry Smith   if (lda>A->rmap->n) {
193c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n,&nz);CHKERRQ(ierr);
194d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1958b83055fSJed Brown       PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v+j*lda,&one));
196a5ce6ee0Svictorle     }
197a5ce6ee0Svictorle   } else {
198c5df96a5SBarry Smith     ierr = PetscBLASIntCast(A->rmap->n*A->cmap->n,&nz);CHKERRQ(ierr);
1998b83055fSJed Brown     PetscStackCallBLAS("BLASscal",BLASscal_(&nz,&oalpha,a->v,&one));
200a5ce6ee0Svictorle   }
201efee365bSSatish Balay   ierr = PetscLogFlops(nz);CHKERRQ(ierr);
2023a40ed3dSBarry Smith   PetscFunctionReturn(0);
20380cd9d93SLois Curfman McInnes }
20480cd9d93SLois Curfman McInnes 
2051cbb95d3SBarry Smith #undef __FUNCT__
2061cbb95d3SBarry Smith #define __FUNCT__ "MatIsHermitian_SeqDense"
207ace3abfcSBarry Smith PetscErrorCode MatIsHermitian_SeqDense(Mat A,PetscReal rtol,PetscBool  *fl)
2081cbb95d3SBarry Smith {
2091cbb95d3SBarry Smith   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
210d0f46423SBarry Smith   PetscInt     i,j,m = A->rmap->n,N;
2111cbb95d3SBarry Smith   PetscScalar  *v = a->v;
2121cbb95d3SBarry Smith 
2131cbb95d3SBarry Smith   PetscFunctionBegin;
2141cbb95d3SBarry Smith   *fl = PETSC_FALSE;
215d0f46423SBarry Smith   if (A->rmap->n != A->cmap->n) PetscFunctionReturn(0);
2161cbb95d3SBarry Smith   N = a->lda;
2171cbb95d3SBarry Smith 
2181cbb95d3SBarry Smith   for (i=0; i<m; i++) {
2191cbb95d3SBarry Smith     for (j=i+1; j<m; j++) {
2201cbb95d3SBarry Smith       if (PetscAbsScalar(v[i+j*N] - PetscConj(v[j+i*N])) > rtol) PetscFunctionReturn(0);
2211cbb95d3SBarry Smith     }
2221cbb95d3SBarry Smith   }
2231cbb95d3SBarry Smith   *fl = PETSC_TRUE;
2241cbb95d3SBarry Smith   PetscFunctionReturn(0);
2251cbb95d3SBarry Smith }
2261cbb95d3SBarry Smith 
227b24902e0SBarry Smith #undef __FUNCT__
228b24902e0SBarry Smith #define __FUNCT__ "MatDuplicateNoCreate_SeqDense"
229719d5645SBarry Smith PetscErrorCode MatDuplicateNoCreate_SeqDense(Mat newi,Mat A,MatDuplicateOption cpvalues)
230b24902e0SBarry Smith {
231b24902e0SBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data,*l;
232b24902e0SBarry Smith   PetscErrorCode ierr;
233b24902e0SBarry Smith   PetscInt       lda = (PetscInt)mat->lda,j,m;
234b24902e0SBarry Smith 
235b24902e0SBarry Smith   PetscFunctionBegin;
236aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->rmap,&newi->rmap);CHKERRQ(ierr);
237aa5ea44dSBarry Smith   ierr = PetscLayoutReference(A->cmap,&newi->cmap);CHKERRQ(ierr);
2380298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(newi,NULL);CHKERRQ(ierr);
239b24902e0SBarry Smith   if (cpvalues == MAT_COPY_VALUES) {
240b24902e0SBarry Smith     l = (Mat_SeqDense*)newi->data;
241d0f46423SBarry Smith     if (lda>A->rmap->n) {
242d0f46423SBarry Smith       m = A->rmap->n;
243d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
244b24902e0SBarry Smith         ierr = PetscMemcpy(l->v+j*m,mat->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
245b24902e0SBarry Smith       }
246b24902e0SBarry Smith     } else {
247d0f46423SBarry Smith       ierr = PetscMemcpy(l->v,mat->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
248b24902e0SBarry Smith     }
249b24902e0SBarry Smith   }
250b24902e0SBarry Smith   newi->assembled = PETSC_TRUE;
251b24902e0SBarry Smith   PetscFunctionReturn(0);
252b24902e0SBarry Smith }
253b24902e0SBarry Smith 
2544a2ae208SSatish Balay #undef __FUNCT__
2554a2ae208SSatish Balay #define __FUNCT__ "MatDuplicate_SeqDense"
256dfbe8321SBarry Smith PetscErrorCode MatDuplicate_SeqDense(Mat A,MatDuplicateOption cpvalues,Mat *newmat)
25702cad45dSBarry Smith {
2586849ba73SBarry Smith   PetscErrorCode ierr;
25902cad45dSBarry Smith 
2603a40ed3dSBarry Smith   PetscFunctionBegin;
261ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),newmat);CHKERRQ(ierr);
262d0f46423SBarry Smith   ierr = MatSetSizes(*newmat,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
2635c9eb25fSBarry Smith   ierr = MatSetType(*newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
264719d5645SBarry Smith   ierr = MatDuplicateNoCreate_SeqDense(*newmat,A,cpvalues);CHKERRQ(ierr);
265b24902e0SBarry Smith   PetscFunctionReturn(0);
266b24902e0SBarry Smith }
267b24902e0SBarry Smith 
2686ee01492SSatish Balay 
2690481f469SBarry Smith extern PetscErrorCode MatLUFactor_SeqDense(Mat,IS,IS,const MatFactorInfo*);
270719d5645SBarry Smith 
2714a2ae208SSatish Balay #undef __FUNCT__
2724a2ae208SSatish Balay #define __FUNCT__ "MatLUFactorNumeric_SeqDense"
2730481f469SBarry Smith PetscErrorCode MatLUFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
274289bc588SBarry Smith {
2754482741eSBarry Smith   MatFactorInfo  info;
276a093e273SMatthew Knepley   PetscErrorCode ierr;
2773a40ed3dSBarry Smith 
2783a40ed3dSBarry Smith   PetscFunctionBegin;
279c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
280719d5645SBarry Smith   ierr = MatLUFactor_SeqDense(fact,0,0,&info);CHKERRQ(ierr);
2813a40ed3dSBarry Smith   PetscFunctionReturn(0);
282289bc588SBarry Smith }
2836ee01492SSatish Balay 
2840b4b3355SBarry Smith #undef __FUNCT__
2854a2ae208SSatish Balay #define __FUNCT__ "MatSolve_SeqDense"
286dfbe8321SBarry Smith PetscErrorCode MatSolve_SeqDense(Mat A,Vec xx,Vec yy)
287289bc588SBarry Smith {
288c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
2896849ba73SBarry Smith   PetscErrorCode    ierr;
290f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
291f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
292c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
29367e560aaSBarry Smith 
2943a40ed3dSBarry Smith   PetscFunctionBegin;
295c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
296f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
2971ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
298d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
299d5f3da31SBarry Smith   if (A->factortype == MAT_FACTOR_LU) {
300ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
301e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
302ae7cfcebSSatish Balay #else
3038b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
304e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
305ae7cfcebSSatish Balay #endif
306d5f3da31SBarry Smith   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
307ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
308e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
309ae7cfcebSSatish Balay #else
3108b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
311e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
312ae7cfcebSSatish Balay #endif
3132205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
314f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
3151ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
316dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
3173a40ed3dSBarry Smith   PetscFunctionReturn(0);
318289bc588SBarry Smith }
3196ee01492SSatish Balay 
3204a2ae208SSatish Balay #undef __FUNCT__
32185e2c93fSHong Zhang #define __FUNCT__ "MatMatSolve_SeqDense"
32285e2c93fSHong Zhang PetscErrorCode MatMatSolve_SeqDense(Mat A,Mat B,Mat X)
32385e2c93fSHong Zhang {
32485e2c93fSHong Zhang   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
32585e2c93fSHong Zhang   PetscErrorCode ierr;
32685e2c93fSHong Zhang   PetscScalar    *b,*x;
327efb80c78SLisandro Dalcin   PetscInt       n;
328783b601eSJed Brown   PetscBLASInt   nrhs,info,m;
329bda8bf91SBarry Smith   PetscBool      flg;
33085e2c93fSHong Zhang 
33185e2c93fSHong Zhang   PetscFunctionBegin;
332c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
3330298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)B,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
334ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix B must be MATDENSE matrix");
3350298fd71SBarry Smith   ierr = PetscObjectTypeCompareAny((PetscObject)X,&flg,MATSEQDENSE,MATMPIDENSE,NULL);CHKERRQ(ierr);
336ce94432eSBarry Smith   if (!flg) SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Matrix X must be MATDENSE matrix");
337bda8bf91SBarry Smith 
3380298fd71SBarry Smith   ierr = MatGetSize(B,NULL,&n);CHKERRQ(ierr);
339c5df96a5SBarry Smith   ierr = PetscBLASIntCast(n,&nrhs);CHKERRQ(ierr);
3408c778c55SBarry Smith   ierr = MatDenseGetArray(B,&b);CHKERRQ(ierr);
3418c778c55SBarry Smith   ierr = MatDenseGetArray(X,&x);CHKERRQ(ierr);
34285e2c93fSHong Zhang 
343f272c775SHong Zhang   ierr = PetscMemcpy(x,b,m*nrhs*sizeof(PetscScalar));CHKERRQ(ierr);
34485e2c93fSHong Zhang 
34585e2c93fSHong Zhang   if (A->factortype == MAT_FACTOR_LU) {
34685e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_GETRS)
34785e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
34885e2c93fSHong Zhang #else
3498b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&nrhs,mat->v,&mat->lda,mat->pivots,x,&m,&info));
35085e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"GETRS - Bad solve");
35185e2c93fSHong Zhang #endif
35285e2c93fSHong Zhang   } else if (A->factortype == MAT_FACTOR_CHOLESKY) {
35385e2c93fSHong Zhang #if defined(PETSC_MISSING_LAPACK_POTRS)
35485e2c93fSHong Zhang     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
35585e2c93fSHong Zhang #else
3568b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&nrhs,mat->v,&mat->lda,x,&m,&info));
35785e2c93fSHong Zhang     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS Bad solve");
35885e2c93fSHong Zhang #endif
3592205254eSKarl Rupp   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Matrix must be factored to solve");
36085e2c93fSHong Zhang 
3618c778c55SBarry Smith   ierr = MatDenseRestoreArray(B,&b);CHKERRQ(ierr);
3628c778c55SBarry Smith   ierr = MatDenseRestoreArray(X,&x);CHKERRQ(ierr);
36385e2c93fSHong Zhang   ierr = PetscLogFlops(nrhs*(2.0*m*m - m));CHKERRQ(ierr);
36485e2c93fSHong Zhang   PetscFunctionReturn(0);
36585e2c93fSHong Zhang }
36685e2c93fSHong Zhang 
36785e2c93fSHong Zhang #undef __FUNCT__
3684a2ae208SSatish Balay #define __FUNCT__ "MatSolveTranspose_SeqDense"
369dfbe8321SBarry Smith PetscErrorCode MatSolveTranspose_SeqDense(Mat A,Vec xx,Vec yy)
370da3a660dSBarry Smith {
371c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
372dfbe8321SBarry Smith   PetscErrorCode    ierr;
373f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
374f1ceaac6SMatthew G. Knepley   PetscScalar       *y;
375c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
37667e560aaSBarry Smith 
3773a40ed3dSBarry Smith   PetscFunctionBegin;
378c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
379f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
3801ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
381d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
382752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
383da3a660dSBarry Smith   if (mat->pivots) {
384ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
385e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
386ae7cfcebSSatish Balay #else
3878b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
388e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
389ae7cfcebSSatish Balay #endif
3907a97a34bSBarry Smith   } else {
391ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
392e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
393ae7cfcebSSatish Balay #else
3948b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
395e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"POTRS - Bad solve");
396ae7cfcebSSatish Balay #endif
397da3a660dSBarry Smith   }
398f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
3991ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
400dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
4013a40ed3dSBarry Smith   PetscFunctionReturn(0);
402da3a660dSBarry Smith }
4036ee01492SSatish Balay 
4044a2ae208SSatish Balay #undef __FUNCT__
4054a2ae208SSatish Balay #define __FUNCT__ "MatSolveAdd_SeqDense"
406dfbe8321SBarry Smith PetscErrorCode MatSolveAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
407da3a660dSBarry Smith {
408c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
409dfbe8321SBarry Smith   PetscErrorCode    ierr;
410f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
411f1ceaac6SMatthew G. Knepley   PetscScalar       *y,sone = 1.0;
412da3a660dSBarry Smith   Vec               tmp = 0;
413c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
41467e560aaSBarry Smith 
4153a40ed3dSBarry Smith   PetscFunctionBegin;
416c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
417f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
4181ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
419d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
420da3a660dSBarry Smith   if (yy == zz) {
42178b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
4223bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
42378b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
424da3a660dSBarry Smith   }
425d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
426752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
427da3a660dSBarry Smith   if (mat->pivots) {
428ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
429e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
430ae7cfcebSSatish Balay #else
4318b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("N",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
432e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
433ae7cfcebSSatish Balay #endif
434a8c6a408SBarry Smith   } else {
435ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
436e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
437ae7cfcebSSatish Balay #else
4388b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
439e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
440ae7cfcebSSatish Balay #endif
441da3a660dSBarry Smith   }
4426bf464f9SBarry Smith   if (tmp) {
4436bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
4446bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4456bf464f9SBarry Smith   } else {
4466bf464f9SBarry Smith     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
4476bf464f9SBarry Smith   }
448f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
4491ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
450dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
4513a40ed3dSBarry Smith   PetscFunctionReturn(0);
452da3a660dSBarry Smith }
45367e560aaSBarry Smith 
4544a2ae208SSatish Balay #undef __FUNCT__
4554a2ae208SSatish Balay #define __FUNCT__ "MatSolveTransposeAdd_SeqDense"
456dfbe8321SBarry Smith PetscErrorCode MatSolveTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
457da3a660dSBarry Smith {
458c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
4596849ba73SBarry Smith   PetscErrorCode    ierr;
460f1ceaac6SMatthew G. Knepley   const PetscScalar *x;
461f1ceaac6SMatthew G. Knepley   PetscScalar       *y,sone = 1.0;
462da3a660dSBarry Smith   Vec               tmp;
463c5df96a5SBarry Smith   PetscBLASInt      one = 1,info,m;
46467e560aaSBarry Smith 
4653a40ed3dSBarry Smith   PetscFunctionBegin;
466c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
467d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
468f1ceaac6SMatthew G. Knepley   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
4691ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
470da3a660dSBarry Smith   if (yy == zz) {
47178b31e54SBarry Smith     ierr = VecDuplicate(yy,&tmp);CHKERRQ(ierr);
4723bb1ff40SBarry Smith     ierr = PetscLogObjectParent((PetscObject)A,(PetscObject)tmp);CHKERRQ(ierr);
47378b31e54SBarry Smith     ierr = VecCopy(yy,tmp);CHKERRQ(ierr);
474da3a660dSBarry Smith   }
475d0f46423SBarry Smith   ierr = PetscMemcpy(y,x,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
476752f5567SLois Curfman McInnes   /* assume if pivots exist then use LU; else Cholesky */
477da3a660dSBarry Smith   if (mat->pivots) {
478ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_GETRS)
479e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRS - Lapack routine is unavailable.");
480ae7cfcebSSatish Balay #else
4818b83055fSJed Brown     PetscStackCallBLAS("LAPACKgetrs",LAPACKgetrs_("T",&m,&one,mat->v,&mat->lda,mat->pivots,y,&m,&info));
482e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
483ae7cfcebSSatish Balay #endif
4843a40ed3dSBarry Smith   } else {
485ae7cfcebSSatish Balay #if defined(PETSC_MISSING_LAPACK_POTRS)
486e32f2f54SBarry Smith     SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRS - Lapack routine is unavailable.");
487ae7cfcebSSatish Balay #else
4888b83055fSJed Brown     PetscStackCallBLAS("LAPACKpotrs",LAPACKpotrs_("L",&m,&one,mat->v,&mat->lda,y,&m,&info));
489e32f2f54SBarry Smith     if (info) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad solve");
490ae7cfcebSSatish Balay #endif
491da3a660dSBarry Smith   }
49290f02eecSBarry Smith   if (tmp) {
4932dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,tmp);CHKERRQ(ierr);
4946bf464f9SBarry Smith     ierr = VecDestroy(&tmp);CHKERRQ(ierr);
4953a40ed3dSBarry Smith   } else {
4962dcb1b2aSMatthew Knepley     ierr = VecAXPY(yy,sone,zz);CHKERRQ(ierr);
49790f02eecSBarry Smith   }
498f1ceaac6SMatthew G. Knepley   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
4991ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
500dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->cmap->n*A->cmap->n);CHKERRQ(ierr);
5013a40ed3dSBarry Smith   PetscFunctionReturn(0);
502da3a660dSBarry Smith }
503db4efbfdSBarry Smith 
504db4efbfdSBarry Smith /* ---------------------------------------------------------------*/
505db4efbfdSBarry Smith /* COMMENT: I have chosen to hide row permutation in the pivots,
506db4efbfdSBarry Smith    rather than put it in the Mat->row slot.*/
507db4efbfdSBarry Smith #undef __FUNCT__
508db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactor_SeqDense"
5090481f469SBarry Smith PetscErrorCode MatLUFactor_SeqDense(Mat A,IS row,IS col,const MatFactorInfo *minfo)
510db4efbfdSBarry Smith {
511db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_GETRF)
512db4efbfdSBarry Smith   PetscFunctionBegin;
513e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"GETRF - Lapack routine is unavailable.");
514db4efbfdSBarry Smith #else
515db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
516db4efbfdSBarry Smith   PetscErrorCode ierr;
517db4efbfdSBarry Smith   PetscBLASInt   n,m,info;
518db4efbfdSBarry Smith 
519db4efbfdSBarry Smith   PetscFunctionBegin;
520c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
521c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
522db4efbfdSBarry Smith   if (!mat->pivots) {
523854ce69bSBarry Smith     ierr = PetscMalloc1(A->rmap->n+1,&mat->pivots);CHKERRQ(ierr);
5243bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)A,A->rmap->n*sizeof(PetscBLASInt));CHKERRQ(ierr);
525db4efbfdSBarry Smith   }
526db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5278e57ea43SSatish Balay   ierr = PetscFPTrapPush(PETSC_FP_TRAP_OFF);CHKERRQ(ierr);
5288b83055fSJed Brown   PetscStackCallBLAS("LAPACKgetrf",LAPACKgetrf_(&m,&n,mat->v,&mat->lda,mat->pivots,&info));
5298e57ea43SSatish Balay   ierr = PetscFPTrapPop();CHKERRQ(ierr);
5308e57ea43SSatish Balay 
531e32f2f54SBarry Smith   if (info<0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_LIB,"Bad argument to LU factorization");
532e32f2f54SBarry Smith   if (info>0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_MAT_LU_ZRPVT,"Bad LU factorization");
533db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
534db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
535db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
536db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
537d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_LU;
538db4efbfdSBarry Smith 
539dc0b31edSSatish Balay   ierr = PetscLogFlops((2.0*A->cmap->n*A->cmap->n*A->cmap->n)/3);CHKERRQ(ierr);
540db4efbfdSBarry Smith #endif
541db4efbfdSBarry Smith   PetscFunctionReturn(0);
542db4efbfdSBarry Smith }
543db4efbfdSBarry Smith 
544db4efbfdSBarry Smith #undef __FUNCT__
545db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactor_SeqDense"
5460481f469SBarry Smith PetscErrorCode MatCholeskyFactor_SeqDense(Mat A,IS perm,const MatFactorInfo *factinfo)
547db4efbfdSBarry Smith {
548db4efbfdSBarry Smith #if defined(PETSC_MISSING_LAPACK_POTRF)
549db4efbfdSBarry Smith   PetscFunctionBegin;
550e32f2f54SBarry Smith   SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"POTRF - Lapack routine is unavailable.");
551db4efbfdSBarry Smith #else
552db4efbfdSBarry Smith   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
553db4efbfdSBarry Smith   PetscErrorCode ierr;
554c5df96a5SBarry Smith   PetscBLASInt   info,n;
555db4efbfdSBarry Smith 
556db4efbfdSBarry Smith   PetscFunctionBegin;
557c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
558db4efbfdSBarry Smith   ierr = PetscFree(mat->pivots);CHKERRQ(ierr);
559db4efbfdSBarry Smith 
560db4efbfdSBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
5618b83055fSJed Brown   PetscStackCallBLAS("LAPACKpotrf",LAPACKpotrf_("L",&n,mat->v,&mat->lda,&info));
562e32f2f54SBarry Smith   if (info) SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_MAT_CH_ZRPVT,"Bad factorization: zero pivot in row %D",(PetscInt)info-1);
563db4efbfdSBarry Smith   A->ops->solve             = MatSolve_SeqDense;
564db4efbfdSBarry Smith   A->ops->solvetranspose    = MatSolveTranspose_SeqDense;
565db4efbfdSBarry Smith   A->ops->solveadd          = MatSolveAdd_SeqDense;
566db4efbfdSBarry Smith   A->ops->solvetransposeadd = MatSolveTransposeAdd_SeqDense;
567d5f3da31SBarry Smith   A->factortype             = MAT_FACTOR_CHOLESKY;
5682205254eSKarl Rupp 
569eb3f19e4SBarry Smith   ierr = PetscLogFlops((1.0*A->cmap->n*A->cmap->n*A->cmap->n)/3.0);CHKERRQ(ierr);
570db4efbfdSBarry Smith #endif
571db4efbfdSBarry Smith   PetscFunctionReturn(0);
572db4efbfdSBarry Smith }
573db4efbfdSBarry Smith 
574db4efbfdSBarry Smith 
575db4efbfdSBarry Smith #undef __FUNCT__
576db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorNumeric_SeqDense"
5770481f469SBarry Smith PetscErrorCode MatCholeskyFactorNumeric_SeqDense(Mat fact,Mat A,const MatFactorInfo *info_dummy)
578db4efbfdSBarry Smith {
579db4efbfdSBarry Smith   PetscErrorCode ierr;
580db4efbfdSBarry Smith   MatFactorInfo  info;
581db4efbfdSBarry Smith 
582db4efbfdSBarry Smith   PetscFunctionBegin;
583db4efbfdSBarry Smith   info.fill = 1.0;
5842205254eSKarl Rupp 
585c3ef05f6SHong Zhang   ierr = MatDuplicateNoCreate_SeqDense(fact,A,MAT_COPY_VALUES);CHKERRQ(ierr);
586719d5645SBarry Smith   ierr = MatCholeskyFactor_SeqDense(fact,0,&info);CHKERRQ(ierr);
587db4efbfdSBarry Smith   PetscFunctionReturn(0);
588db4efbfdSBarry Smith }
589db4efbfdSBarry Smith 
590db4efbfdSBarry Smith #undef __FUNCT__
591db4efbfdSBarry Smith #define __FUNCT__ "MatCholeskyFactorSymbolic_SeqDense"
5920481f469SBarry Smith PetscErrorCode MatCholeskyFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,const MatFactorInfo *info)
593db4efbfdSBarry Smith {
594db4efbfdSBarry Smith   PetscFunctionBegin;
595c3ef05f6SHong Zhang   fact->assembled                  = PETSC_TRUE;
5961bbcc794SSatish Balay   fact->preallocated               = PETSC_TRUE;
597719d5645SBarry Smith   fact->ops->choleskyfactornumeric = MatCholeskyFactorNumeric_SeqDense;
598db4efbfdSBarry Smith   PetscFunctionReturn(0);
599db4efbfdSBarry Smith }
600db4efbfdSBarry Smith 
601db4efbfdSBarry Smith #undef __FUNCT__
602db4efbfdSBarry Smith #define __FUNCT__ "MatLUFactorSymbolic_SeqDense"
6030481f469SBarry Smith PetscErrorCode MatLUFactorSymbolic_SeqDense(Mat fact,Mat A,IS row,IS col,const MatFactorInfo *info)
604db4efbfdSBarry Smith {
605db4efbfdSBarry Smith   PetscFunctionBegin;
606b66fe19dSMatthew G Knepley   fact->preallocated         = PETSC_TRUE;
607c3ef05f6SHong Zhang   fact->assembled            = PETSC_TRUE;
608719d5645SBarry Smith   fact->ops->lufactornumeric = MatLUFactorNumeric_SeqDense;
609db4efbfdSBarry Smith   PetscFunctionReturn(0);
610db4efbfdSBarry Smith }
611db4efbfdSBarry Smith 
612db4efbfdSBarry Smith #undef __FUNCT__
613db4efbfdSBarry Smith #define __FUNCT__ "MatGetFactor_seqdense_petsc"
6148cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatGetFactor_seqdense_petsc(Mat A,MatFactorType ftype,Mat *fact)
615db4efbfdSBarry Smith {
616db4efbfdSBarry Smith   PetscErrorCode ierr;
617db4efbfdSBarry Smith 
618db4efbfdSBarry Smith   PetscFunctionBegin;
619ce94432eSBarry Smith   ierr = MatCreate(PetscObjectComm((PetscObject)A),fact);CHKERRQ(ierr);
620db4efbfdSBarry Smith   ierr = MatSetSizes(*fact,A->rmap->n,A->cmap->n,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
621db4efbfdSBarry Smith   ierr = MatSetType(*fact,((PetscObject)A)->type_name);CHKERRQ(ierr);
622db4efbfdSBarry Smith   if (ftype == MAT_FACTOR_LU) {
623db4efbfdSBarry Smith     (*fact)->ops->lufactorsymbolic = MatLUFactorSymbolic_SeqDense;
624db4efbfdSBarry Smith   } else {
625db4efbfdSBarry Smith     (*fact)->ops->choleskyfactorsymbolic = MatCholeskyFactorSymbolic_SeqDense;
626db4efbfdSBarry Smith   }
627d5f3da31SBarry Smith   (*fact)->factortype = ftype;
628db4efbfdSBarry Smith   PetscFunctionReturn(0);
629db4efbfdSBarry Smith }
630db4efbfdSBarry Smith 
631289bc588SBarry Smith /* ------------------------------------------------------------------*/
6324a2ae208SSatish Balay #undef __FUNCT__
63341f059aeSBarry Smith #define __FUNCT__ "MatSOR_SeqDense"
63441f059aeSBarry Smith PetscErrorCode MatSOR_SeqDense(Mat A,Vec bb,PetscReal omega,MatSORType flag,PetscReal shift,PetscInt its,PetscInt lits,Vec xx)
635289bc588SBarry Smith {
636c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
637d9ca1df4SBarry Smith   PetscScalar       *x,*v = mat->v,zero = 0.0,xt;
638d9ca1df4SBarry Smith   const PetscScalar *b;
639dfbe8321SBarry Smith   PetscErrorCode    ierr;
640d0f46423SBarry Smith   PetscInt          m = A->rmap->n,i;
641c5df96a5SBarry Smith   PetscBLASInt      o = 1,bm;
642289bc588SBarry Smith 
6433a40ed3dSBarry Smith   PetscFunctionBegin;
644422a814eSBarry Smith   if (shift == -1) shift = 0.0; /* negative shift indicates do not error on zero diagonal; this code never zeros on zero diagonal */
645c5df96a5SBarry Smith   ierr = PetscBLASIntCast(m,&bm);CHKERRQ(ierr);
646289bc588SBarry Smith   if (flag & SOR_ZERO_INITIAL_GUESS) {
64771044d3cSBarry Smith     /* this is a hack fix, should have another version without the second BLASdot */
6482dcb1b2aSMatthew Knepley     ierr = VecSet(xx,zero);CHKERRQ(ierr);
649289bc588SBarry Smith   }
6501ebc52fbSHong Zhang   ierr = VecGetArray(xx,&x);CHKERRQ(ierr);
651d9ca1df4SBarry Smith   ierr = VecGetArrayRead(bb,&b);CHKERRQ(ierr);
652b965ef7fSBarry Smith   its  = its*lits;
653e32f2f54SBarry 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);
654289bc588SBarry Smith   while (its--) {
655fccaa45eSBarry Smith     if (flag & SOR_FORWARD_SWEEP || flag & SOR_LOCAL_FORWARD_SWEEP) {
656289bc588SBarry Smith       for (i=0; i<m; i++) {
6578b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
65855a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
659289bc588SBarry Smith       }
660289bc588SBarry Smith     }
661fccaa45eSBarry Smith     if (flag & SOR_BACKWARD_SWEEP || flag & SOR_LOCAL_BACKWARD_SWEEP) {
662289bc588SBarry Smith       for (i=m-1; i>=0; i--) {
6638b83055fSJed Brown         PetscStackCallBLAS("BLASdot",xt   = b[i] - BLASdot_(&bm,v+i,&bm,x,&o));
66455a1b374SBarry Smith         x[i] = (1. - omega)*x[i] + omega*(xt+v[i + i*m]*x[i])/(v[i + i*m]+shift);
665289bc588SBarry Smith       }
666289bc588SBarry Smith     }
667289bc588SBarry Smith   }
668d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(bb,&b);CHKERRQ(ierr);
6691ebc52fbSHong Zhang   ierr = VecRestoreArray(xx,&x);CHKERRQ(ierr);
6703a40ed3dSBarry Smith   PetscFunctionReturn(0);
671289bc588SBarry Smith }
672289bc588SBarry Smith 
673289bc588SBarry Smith /* -----------------------------------------------------------------*/
6744a2ae208SSatish Balay #undef __FUNCT__
6754a2ae208SSatish Balay #define __FUNCT__ "MatMultTranspose_SeqDense"
676dfbe8321SBarry Smith PetscErrorCode MatMultTranspose_SeqDense(Mat A,Vec xx,Vec yy)
677289bc588SBarry Smith {
678c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
679d9ca1df4SBarry Smith   const PetscScalar *v   = mat->v,*x;
680d9ca1df4SBarry Smith   PetscScalar       *y;
681dfbe8321SBarry Smith   PetscErrorCode    ierr;
6820805154bSBarry Smith   PetscBLASInt      m, n,_One=1;
683ea709b57SSatish Balay   PetscScalar       _DOne=1.0,_DZero=0.0;
6843a40ed3dSBarry Smith 
6853a40ed3dSBarry Smith   PetscFunctionBegin;
686c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
687c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
688d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
689d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
6901ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
6918b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&mat->lda,x,&_One,&_DZero,y,&_One));
692d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
6931ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
694dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->cmap->n);CHKERRQ(ierr);
6953a40ed3dSBarry Smith   PetscFunctionReturn(0);
696289bc588SBarry Smith }
697800995b7SMatthew Knepley 
6984a2ae208SSatish Balay #undef __FUNCT__
6994a2ae208SSatish Balay #define __FUNCT__ "MatMult_SeqDense"
700dfbe8321SBarry Smith PetscErrorCode MatMult_SeqDense(Mat A,Vec xx,Vec yy)
701289bc588SBarry Smith {
702c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
703d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0,_DZero=0.0;
704dfbe8321SBarry Smith   PetscErrorCode    ierr;
7050805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
706d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
7073a40ed3dSBarry Smith 
7083a40ed3dSBarry Smith   PetscFunctionBegin;
709c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
710c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
711d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
712d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7131ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7148b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DZero,y,&_One));
715d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7161ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
717dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n - A->rmap->n);CHKERRQ(ierr);
7183a40ed3dSBarry Smith   PetscFunctionReturn(0);
719289bc588SBarry Smith }
7206ee01492SSatish Balay 
7214a2ae208SSatish Balay #undef __FUNCT__
7224a2ae208SSatish Balay #define __FUNCT__ "MatMultAdd_SeqDense"
723dfbe8321SBarry Smith PetscErrorCode MatMultAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
724289bc588SBarry Smith {
725c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
726d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
727d9ca1df4SBarry Smith   PetscScalar       *y,_DOne=1.0;
728dfbe8321SBarry Smith   PetscErrorCode    ierr;
7290805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
7303a40ed3dSBarry Smith 
7313a40ed3dSBarry Smith   PetscFunctionBegin;
732c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
733c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
734d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
735600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
736d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7371ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7388b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("N",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
739d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7401ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
741dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
7423a40ed3dSBarry Smith   PetscFunctionReturn(0);
743289bc588SBarry Smith }
7446ee01492SSatish Balay 
7454a2ae208SSatish Balay #undef __FUNCT__
7464a2ae208SSatish Balay #define __FUNCT__ "MatMultTransposeAdd_SeqDense"
747dfbe8321SBarry Smith PetscErrorCode MatMultTransposeAdd_SeqDense(Mat A,Vec xx,Vec zz,Vec yy)
748289bc588SBarry Smith {
749c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
750d9ca1df4SBarry Smith   const PetscScalar *v = mat->v,*x;
751d9ca1df4SBarry Smith   PetscScalar       *y;
752dfbe8321SBarry Smith   PetscErrorCode    ierr;
7530805154bSBarry Smith   PetscBLASInt      m, n, _One=1;
75487828ca2SBarry Smith   PetscScalar       _DOne=1.0;
7553a40ed3dSBarry Smith 
7563a40ed3dSBarry Smith   PetscFunctionBegin;
757c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
758c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&n);CHKERRQ(ierr);
759d0f46423SBarry Smith   if (!A->rmap->n || !A->cmap->n) PetscFunctionReturn(0);
760600d6d0bSBarry Smith   if (zz != yy) {ierr = VecCopy(zz,yy);CHKERRQ(ierr);}
761d9ca1df4SBarry Smith   ierr = VecGetArrayRead(xx,&x);CHKERRQ(ierr);
7621ebc52fbSHong Zhang   ierr = VecGetArray(yy,&y);CHKERRQ(ierr);
7638b83055fSJed Brown   PetscStackCallBLAS("BLASgemv",BLASgemv_("T",&m,&n,&_DOne,v,&(mat->lda),x,&_One,&_DOne,y,&_One));
764d9ca1df4SBarry Smith   ierr = VecRestoreArrayRead(xx,&x);CHKERRQ(ierr);
7651ebc52fbSHong Zhang   ierr = VecRestoreArray(yy,&y);CHKERRQ(ierr);
766dc0b31edSSatish Balay   ierr = PetscLogFlops(2.0*A->rmap->n*A->cmap->n);CHKERRQ(ierr);
7673a40ed3dSBarry Smith   PetscFunctionReturn(0);
768289bc588SBarry Smith }
769289bc588SBarry Smith 
770289bc588SBarry Smith /* -----------------------------------------------------------------*/
7714a2ae208SSatish Balay #undef __FUNCT__
7724a2ae208SSatish Balay #define __FUNCT__ "MatGetRow_SeqDense"
77313f74950SBarry Smith PetscErrorCode MatGetRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
774289bc588SBarry Smith {
775c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
77687828ca2SBarry Smith   PetscScalar    *v;
7776849ba73SBarry Smith   PetscErrorCode ierr;
77813f74950SBarry Smith   PetscInt       i;
77967e560aaSBarry Smith 
7803a40ed3dSBarry Smith   PetscFunctionBegin;
781d0f46423SBarry Smith   *ncols = A->cmap->n;
782289bc588SBarry Smith   if (cols) {
783854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,cols);CHKERRQ(ierr);
784d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) (*cols)[i] = i;
785289bc588SBarry Smith   }
786289bc588SBarry Smith   if (vals) {
787854ce69bSBarry Smith     ierr = PetscMalloc1(A->cmap->n+1,vals);CHKERRQ(ierr);
788289bc588SBarry Smith     v    = mat->v + row;
789d0f46423SBarry Smith     for (i=0; i<A->cmap->n; i++) {(*vals)[i] = *v; v += mat->lda;}
790289bc588SBarry Smith   }
7913a40ed3dSBarry Smith   PetscFunctionReturn(0);
792289bc588SBarry Smith }
7936ee01492SSatish Balay 
7944a2ae208SSatish Balay #undef __FUNCT__
7954a2ae208SSatish Balay #define __FUNCT__ "MatRestoreRow_SeqDense"
79613f74950SBarry Smith PetscErrorCode MatRestoreRow_SeqDense(Mat A,PetscInt row,PetscInt *ncols,PetscInt **cols,PetscScalar **vals)
797289bc588SBarry Smith {
798dfbe8321SBarry Smith   PetscErrorCode ierr;
7996e111a19SKarl Rupp 
800606d414cSSatish Balay   PetscFunctionBegin;
801606d414cSSatish Balay   if (cols) {ierr = PetscFree(*cols);CHKERRQ(ierr);}
802606d414cSSatish Balay   if (vals) {ierr = PetscFree(*vals);CHKERRQ(ierr); }
8033a40ed3dSBarry Smith   PetscFunctionReturn(0);
804289bc588SBarry Smith }
805289bc588SBarry Smith /* ----------------------------------------------------------------*/
8064a2ae208SSatish Balay #undef __FUNCT__
8074a2ae208SSatish Balay #define __FUNCT__ "MatSetValues_SeqDense"
80813f74950SBarry Smith PetscErrorCode MatSetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],const PetscScalar v[],InsertMode addv)
809289bc588SBarry Smith {
810c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
81113f74950SBarry Smith   PetscInt     i,j,idx=0;
812d6dfbf8fSBarry Smith 
8133a40ed3dSBarry Smith   PetscFunctionBegin;
814289bc588SBarry Smith   if (!mat->roworiented) {
815dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
816289bc588SBarry Smith       for (j=0; j<n; j++) {
817cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
8182515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
819e32f2f54SBarry 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);
82058804f6dSBarry Smith #endif
821289bc588SBarry Smith         for (i=0; i<m; i++) {
822cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
8232515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
824e32f2f54SBarry 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);
82558804f6dSBarry Smith #endif
826cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
827289bc588SBarry Smith         }
828289bc588SBarry Smith       }
8293a40ed3dSBarry Smith     } else {
830289bc588SBarry Smith       for (j=0; j<n; j++) {
831cddbea37SSatish Balay         if (indexn[j] < 0) {idx += m; continue;}
8322515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
833e32f2f54SBarry 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);
83458804f6dSBarry Smith #endif
835289bc588SBarry Smith         for (i=0; i<m; i++) {
836cddbea37SSatish Balay           if (indexm[i] < 0) {idx++; continue;}
8372515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
838e32f2f54SBarry 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);
83958804f6dSBarry Smith #endif
840cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
841289bc588SBarry Smith         }
842289bc588SBarry Smith       }
843289bc588SBarry Smith     }
8443a40ed3dSBarry Smith   } else {
845dbb450caSBarry Smith     if (addv == INSERT_VALUES) {
846e8d4e0b9SBarry Smith       for (i=0; i<m; i++) {
847cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
8482515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
849e32f2f54SBarry 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);
85058804f6dSBarry Smith #endif
851e8d4e0b9SBarry Smith         for (j=0; j<n; j++) {
852cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
8532515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
854e32f2f54SBarry 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);
85558804f6dSBarry Smith #endif
856cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] = v[idx++];
857e8d4e0b9SBarry Smith         }
858e8d4e0b9SBarry Smith       }
8593a40ed3dSBarry Smith     } else {
860289bc588SBarry Smith       for (i=0; i<m; i++) {
861cddbea37SSatish Balay         if (indexm[i] < 0) { idx += n; continue;}
8622515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
863e32f2f54SBarry 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);
86458804f6dSBarry Smith #endif
865289bc588SBarry Smith         for (j=0; j<n; j++) {
866cddbea37SSatish Balay           if (indexn[j] < 0) { idx++; continue;}
8672515c552SBarry Smith #if defined(PETSC_USE_DEBUG)
868e32f2f54SBarry 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);
86958804f6dSBarry Smith #endif
870cddbea37SSatish Balay           mat->v[indexn[j]*mat->lda + indexm[i]] += v[idx++];
871289bc588SBarry Smith         }
872289bc588SBarry Smith       }
873289bc588SBarry Smith     }
874e8d4e0b9SBarry Smith   }
8753a40ed3dSBarry Smith   PetscFunctionReturn(0);
876289bc588SBarry Smith }
877e8d4e0b9SBarry Smith 
8784a2ae208SSatish Balay #undef __FUNCT__
8794a2ae208SSatish Balay #define __FUNCT__ "MatGetValues_SeqDense"
88013f74950SBarry Smith PetscErrorCode MatGetValues_SeqDense(Mat A,PetscInt m,const PetscInt indexm[],PetscInt n,const PetscInt indexn[],PetscScalar v[])
881ae80bb75SLois Curfman McInnes {
882ae80bb75SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
88313f74950SBarry Smith   PetscInt     i,j;
884ae80bb75SLois Curfman McInnes 
8853a40ed3dSBarry Smith   PetscFunctionBegin;
886ae80bb75SLois Curfman McInnes   /* row-oriented output */
887ae80bb75SLois Curfman McInnes   for (i=0; i<m; i++) {
88897e567efSBarry Smith     if (indexm[i] < 0) {v += n;continue;}
889e32f2f54SBarry 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);
890ae80bb75SLois Curfman McInnes     for (j=0; j<n; j++) {
8916f31f424SBarry Smith       if (indexn[j] < 0) {v++; continue;}
892e32f2f54SBarry 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);
89397e567efSBarry Smith       *v++ = mat->v[indexn[j]*mat->lda + indexm[i]];
894ae80bb75SLois Curfman McInnes     }
895ae80bb75SLois Curfman McInnes   }
8963a40ed3dSBarry Smith   PetscFunctionReturn(0);
897ae80bb75SLois Curfman McInnes }
898ae80bb75SLois Curfman McInnes 
899289bc588SBarry Smith /* -----------------------------------------------------------------*/
900289bc588SBarry Smith 
9014a2ae208SSatish Balay #undef __FUNCT__
9025bba2384SShri Abhyankar #define __FUNCT__ "MatLoad_SeqDense"
903112444f4SShri Abhyankar PetscErrorCode MatLoad_SeqDense(Mat newmat,PetscViewer viewer)
904aabbc4fbSShri Abhyankar {
905aabbc4fbSShri Abhyankar   Mat_SeqDense   *a;
906aabbc4fbSShri Abhyankar   PetscErrorCode ierr;
907aabbc4fbSShri Abhyankar   PetscInt       *scols,i,j,nz,header[4];
908aabbc4fbSShri Abhyankar   int            fd;
909aabbc4fbSShri Abhyankar   PetscMPIInt    size;
910aabbc4fbSShri Abhyankar   PetscInt       *rowlengths = 0,M,N,*cols,grows,gcols;
911aabbc4fbSShri Abhyankar   PetscScalar    *vals,*svals,*v,*w;
912ce94432eSBarry Smith   MPI_Comm       comm;
913aabbc4fbSShri Abhyankar 
914aabbc4fbSShri Abhyankar   PetscFunctionBegin;
915c98fd787SBarry Smith   /* force binary viewer to load .info file if it has not yet done so */
916c98fd787SBarry Smith   ierr = PetscViewerSetUp(viewer);CHKERRQ(ierr);
917ce94432eSBarry Smith   ierr = PetscObjectGetComm((PetscObject)viewer,&comm);CHKERRQ(ierr);
918aabbc4fbSShri Abhyankar   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
919aabbc4fbSShri Abhyankar   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"view must have one processor");
920aabbc4fbSShri Abhyankar   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
921aabbc4fbSShri Abhyankar   ierr = PetscBinaryRead(fd,header,4,PETSC_INT);CHKERRQ(ierr);
922aabbc4fbSShri Abhyankar   if (header[0] != MAT_FILE_CLASSID) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_FILE_UNEXPECTED,"Not matrix object");
923aabbc4fbSShri Abhyankar   M = header[1]; N = header[2]; nz = header[3];
924aabbc4fbSShri Abhyankar 
925aabbc4fbSShri Abhyankar   /* set global size if not set already*/
926aabbc4fbSShri Abhyankar   if (newmat->rmap->n < 0 && newmat->rmap->N < 0 && newmat->cmap->n < 0 && newmat->cmap->N < 0) {
927aabbc4fbSShri Abhyankar     ierr = MatSetSizes(newmat,M,N,M,N);CHKERRQ(ierr);
928aabbc4fbSShri Abhyankar   } else {
929aabbc4fbSShri Abhyankar     /* if sizes and type are already set, check if the vector global sizes are correct */
930aabbc4fbSShri Abhyankar     ierr = MatGetSize(newmat,&grows,&gcols);CHKERRQ(ierr);
931aabbc4fbSShri 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);
932aabbc4fbSShri Abhyankar   }
933e6324fbbSBarry Smith   a = (Mat_SeqDense*)newmat->data;
934e6324fbbSBarry Smith   if (!a->user_alloc) {
9350298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
936e6324fbbSBarry Smith   }
937aabbc4fbSShri Abhyankar 
938aabbc4fbSShri Abhyankar   if (nz == MATRIX_BINARY_FORMAT_DENSE) { /* matrix in file is dense */
939aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
940aabbc4fbSShri Abhyankar     v = a->v;
941aabbc4fbSShri Abhyankar     /* Allocate some temp space to read in the values and then flip them
942aabbc4fbSShri Abhyankar        from row major to column major */
943854ce69bSBarry Smith     ierr = PetscMalloc1(M*N > 0 ? M*N : 1,&w);CHKERRQ(ierr);
944aabbc4fbSShri Abhyankar     /* read in nonzero values */
945aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,w,M*N,PETSC_SCALAR);CHKERRQ(ierr);
946aabbc4fbSShri Abhyankar     /* now flip the values and store them in the matrix*/
947aabbc4fbSShri Abhyankar     for (j=0; j<N; j++) {
948aabbc4fbSShri Abhyankar       for (i=0; i<M; i++) {
949aabbc4fbSShri Abhyankar         *v++ =w[i*N+j];
950aabbc4fbSShri Abhyankar       }
951aabbc4fbSShri Abhyankar     }
952aabbc4fbSShri Abhyankar     ierr = PetscFree(w);CHKERRQ(ierr);
953aabbc4fbSShri Abhyankar   } else {
954aabbc4fbSShri Abhyankar     /* read row lengths */
955854ce69bSBarry Smith     ierr = PetscMalloc1(M+1,&rowlengths);CHKERRQ(ierr);
956aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,rowlengths,M,PETSC_INT);CHKERRQ(ierr);
957aabbc4fbSShri Abhyankar 
958aabbc4fbSShri Abhyankar     a = (Mat_SeqDense*)newmat->data;
959aabbc4fbSShri Abhyankar     v = a->v;
960aabbc4fbSShri Abhyankar 
961aabbc4fbSShri Abhyankar     /* read column indices and nonzeros */
962854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&scols);CHKERRQ(ierr);
963aabbc4fbSShri Abhyankar     cols = scols;
964aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,cols,nz,PETSC_INT);CHKERRQ(ierr);
965854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&svals);CHKERRQ(ierr);
966aabbc4fbSShri Abhyankar     vals = svals;
967aabbc4fbSShri Abhyankar     ierr = PetscBinaryRead(fd,vals,nz,PETSC_SCALAR);CHKERRQ(ierr);
968aabbc4fbSShri Abhyankar 
969aabbc4fbSShri Abhyankar     /* insert into matrix */
970aabbc4fbSShri Abhyankar     for (i=0; i<M; i++) {
971aabbc4fbSShri Abhyankar       for (j=0; j<rowlengths[i]; j++) v[i+M*scols[j]] = svals[j];
972aabbc4fbSShri Abhyankar       svals += rowlengths[i]; scols += rowlengths[i];
973aabbc4fbSShri Abhyankar     }
974aabbc4fbSShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
975aabbc4fbSShri Abhyankar     ierr = PetscFree(cols);CHKERRQ(ierr);
976aabbc4fbSShri Abhyankar     ierr = PetscFree(rowlengths);CHKERRQ(ierr);
977aabbc4fbSShri Abhyankar   }
978aabbc4fbSShri Abhyankar   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
979aabbc4fbSShri Abhyankar   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
980aabbc4fbSShri Abhyankar   PetscFunctionReturn(0);
981aabbc4fbSShri Abhyankar }
982aabbc4fbSShri Abhyankar 
983aabbc4fbSShri Abhyankar #undef __FUNCT__
9844a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_ASCII"
9856849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_ASCII(Mat A,PetscViewer viewer)
986289bc588SBarry Smith {
987932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
988dfbe8321SBarry Smith   PetscErrorCode    ierr;
98913f74950SBarry Smith   PetscInt          i,j;
9902dcb1b2aSMatthew Knepley   const char        *name;
99187828ca2SBarry Smith   PetscScalar       *v;
992f3ef73ceSBarry Smith   PetscViewerFormat format;
9935f481a85SSatish Balay #if defined(PETSC_USE_COMPLEX)
994ace3abfcSBarry Smith   PetscBool         allreal = PETSC_TRUE;
9955f481a85SSatish Balay #endif
996932b0c3eSLois Curfman McInnes 
9973a40ed3dSBarry Smith   PetscFunctionBegin;
998b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
999456192e2SBarry Smith   if (format == PETSC_VIEWER_ASCII_INFO || format == PETSC_VIEWER_ASCII_INFO_DETAIL) {
10003a40ed3dSBarry Smith     PetscFunctionReturn(0);  /* do nothing for now */
1001fb9695e5SSatish Balay   } else if (format == PETSC_VIEWER_ASCII_COMMON) {
1002d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1003d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
100444cd7ae7SLois Curfman McInnes       v    = a->v + i;
100577431f27SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"row %D:",i);CHKERRQ(ierr);
1006d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1007aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
1008329f5518SBarry Smith         if (PetscRealPart(*v) != 0.0 && PetscImaginaryPart(*v) != 0.0) {
100957622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g + %g i) ",j,(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
1010329f5518SBarry Smith         } else if (PetscRealPart(*v)) {
101157622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)PetscRealPart(*v));CHKERRQ(ierr);
10126831982aSBarry Smith         }
101380cd9d93SLois Curfman McInnes #else
10146831982aSBarry Smith         if (*v) {
101557622a8eSBarry Smith           ierr = PetscViewerASCIIPrintf(viewer," (%D, %g) ",j,(double)*v);CHKERRQ(ierr);
10166831982aSBarry Smith         }
101780cd9d93SLois Curfman McInnes #endif
10181b807ce4Svictorle         v += a->lda;
101980cd9d93SLois Curfman McInnes       }
1020b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
102180cd9d93SLois Curfman McInnes     }
1022d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
10233a40ed3dSBarry Smith   } else {
1024d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
1025aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
102647989497SBarry Smith     /* determine if matrix has all real values */
102747989497SBarry Smith     v = a->v;
1028d0f46423SBarry Smith     for (i=0; i<A->rmap->n*A->cmap->n; i++) {
1029ffac6cdbSBarry Smith       if (PetscImaginaryPart(v[i])) { allreal = PETSC_FALSE; break;}
103047989497SBarry Smith     }
103147989497SBarry Smith #endif
1032fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
10333a7fca6bSBarry Smith       ierr = PetscObjectGetName((PetscObject)A,&name);CHKERRQ(ierr);
1034d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%% Size = %D %D \n",A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1035d0f46423SBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"%s = zeros(%D,%D);\n",name,A->rmap->n,A->cmap->n);CHKERRQ(ierr);
1036fb9695e5SSatish Balay       ierr = PetscViewerASCIIPrintf(viewer,"%s = [\n",name);CHKERRQ(ierr);
1037ffac6cdbSBarry Smith     }
1038ffac6cdbSBarry Smith 
1039d0f46423SBarry Smith     for (i=0; i<A->rmap->n; i++) {
1040932b0c3eSLois Curfman McInnes       v = a->v + i;
1041d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1042aa482453SBarry Smith #if defined(PETSC_USE_COMPLEX)
104347989497SBarry Smith         if (allreal) {
1044c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)PetscRealPart(*v));CHKERRQ(ierr);
104547989497SBarry Smith         } else {
1046c61cd2faSJed Brown           ierr = PetscViewerASCIIPrintf(viewer,"%18.16e + %18.16ei ",(double)PetscRealPart(*v),(double)PetscImaginaryPart(*v));CHKERRQ(ierr);
104747989497SBarry Smith         }
1048289bc588SBarry Smith #else
1049c61cd2faSJed Brown         ierr = PetscViewerASCIIPrintf(viewer,"%18.16e ",(double)*v);CHKERRQ(ierr);
1050289bc588SBarry Smith #endif
10511b807ce4Svictorle         v += a->lda;
1052289bc588SBarry Smith       }
1053b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"\n");CHKERRQ(ierr);
1054289bc588SBarry Smith     }
1055fb9695e5SSatish Balay     if (format == PETSC_VIEWER_ASCII_MATLAB) {
1056b0a32e0cSBarry Smith       ierr = PetscViewerASCIIPrintf(viewer,"];\n");CHKERRQ(ierr);
1057ffac6cdbSBarry Smith     }
1058d00279f6SBarry Smith     ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
1059da3a660dSBarry Smith   }
1060b0a32e0cSBarry Smith   ierr = PetscViewerFlush(viewer);CHKERRQ(ierr);
10613a40ed3dSBarry Smith   PetscFunctionReturn(0);
1062289bc588SBarry Smith }
1063289bc588SBarry Smith 
10644a2ae208SSatish Balay #undef __FUNCT__
10654a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Binary"
10666849ba73SBarry Smith static PetscErrorCode MatView_SeqDense_Binary(Mat A,PetscViewer viewer)
1067932b0c3eSLois Curfman McInnes {
1068932b0c3eSLois Curfman McInnes   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
10696849ba73SBarry Smith   PetscErrorCode    ierr;
107013f74950SBarry Smith   int               fd;
1071d0f46423SBarry Smith   PetscInt          ict,j,n = A->cmap->n,m = A->rmap->n,i,*col_lens,nz = m*n;
1072f4403165SShri Abhyankar   PetscScalar       *v,*anonz,*vals;
1073f4403165SShri Abhyankar   PetscViewerFormat format;
1074932b0c3eSLois Curfman McInnes 
10753a40ed3dSBarry Smith   PetscFunctionBegin;
1076b0a32e0cSBarry Smith   ierr = PetscViewerBinaryGetDescriptor(viewer,&fd);CHKERRQ(ierr);
107790ace30eSBarry Smith 
1078f4403165SShri Abhyankar   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1079f4403165SShri Abhyankar   if (format == PETSC_VIEWER_NATIVE) {
1080f4403165SShri Abhyankar     /* store the matrix as a dense matrix */
1081785e854fSJed Brown     ierr = PetscMalloc1(4,&col_lens);CHKERRQ(ierr);
10822205254eSKarl Rupp 
1083f4403165SShri Abhyankar     col_lens[0] = MAT_FILE_CLASSID;
1084f4403165SShri Abhyankar     col_lens[1] = m;
1085f4403165SShri Abhyankar     col_lens[2] = n;
1086f4403165SShri Abhyankar     col_lens[3] = MATRIX_BINARY_FORMAT_DENSE;
10872205254eSKarl Rupp 
1088f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,col_lens,4,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1089f4403165SShri Abhyankar     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1090f4403165SShri Abhyankar 
1091f4403165SShri Abhyankar     /* write out matrix, by rows */
1092854ce69bSBarry Smith     ierr = PetscMalloc1(m*n+1,&vals);CHKERRQ(ierr);
1093f4403165SShri Abhyankar     v    = a->v;
1094f4403165SShri Abhyankar     for (j=0; j<n; j++) {
1095f4403165SShri Abhyankar       for (i=0; i<m; i++) {
1096f4403165SShri Abhyankar         vals[j + i*n] = *v++;
1097f4403165SShri Abhyankar       }
1098f4403165SShri Abhyankar     }
1099f4403165SShri Abhyankar     ierr = PetscBinaryWrite(fd,vals,n*m,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1100f4403165SShri Abhyankar     ierr = PetscFree(vals);CHKERRQ(ierr);
1101f4403165SShri Abhyankar   } else {
1102854ce69bSBarry Smith     ierr = PetscMalloc1(4+nz,&col_lens);CHKERRQ(ierr);
11032205254eSKarl Rupp 
11040700a824SBarry Smith     col_lens[0] = MAT_FILE_CLASSID;
1105932b0c3eSLois Curfman McInnes     col_lens[1] = m;
1106932b0c3eSLois Curfman McInnes     col_lens[2] = n;
1107932b0c3eSLois Curfman McInnes     col_lens[3] = nz;
1108932b0c3eSLois Curfman McInnes 
1109932b0c3eSLois Curfman McInnes     /* store lengths of each row and write (including header) to file */
1110932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) col_lens[4+i] = n;
11116f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,4+m,PETSC_INT,PETSC_TRUE);CHKERRQ(ierr);
1112932b0c3eSLois Curfman McInnes 
1113932b0c3eSLois Curfman McInnes     /* Possibly should write in smaller increments, not whole matrix at once? */
1114932b0c3eSLois Curfman McInnes     /* store column indices (zero start index) */
1115932b0c3eSLois Curfman McInnes     ict = 0;
1116932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1117932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) col_lens[ict++] = j;
1118932b0c3eSLois Curfman McInnes     }
11196f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,col_lens,nz,PETSC_INT,PETSC_FALSE);CHKERRQ(ierr);
1120606d414cSSatish Balay     ierr = PetscFree(col_lens);CHKERRQ(ierr);
1121932b0c3eSLois Curfman McInnes 
1122932b0c3eSLois Curfman McInnes     /* store nonzero values */
1123854ce69bSBarry Smith     ierr = PetscMalloc1(nz+1,&anonz);CHKERRQ(ierr);
1124932b0c3eSLois Curfman McInnes     ict  = 0;
1125932b0c3eSLois Curfman McInnes     for (i=0; i<m; i++) {
1126932b0c3eSLois Curfman McInnes       v = a->v + i;
1127932b0c3eSLois Curfman McInnes       for (j=0; j<n; j++) {
11281b807ce4Svictorle         anonz[ict++] = *v; v += a->lda;
1129932b0c3eSLois Curfman McInnes       }
1130932b0c3eSLois Curfman McInnes     }
11316f69ff64SBarry Smith     ierr = PetscBinaryWrite(fd,anonz,nz,PETSC_SCALAR,PETSC_FALSE);CHKERRQ(ierr);
1132606d414cSSatish Balay     ierr = PetscFree(anonz);CHKERRQ(ierr);
1133f4403165SShri Abhyankar   }
11343a40ed3dSBarry Smith   PetscFunctionReturn(0);
1135932b0c3eSLois Curfman McInnes }
1136932b0c3eSLois Curfman McInnes 
11379804daf3SBarry Smith #include <petscdraw.h>
11384a2ae208SSatish Balay #undef __FUNCT__
11394a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw_Zoom"
1140dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw_Zoom(PetscDraw draw,void *Aa)
1141f1af5d2fSBarry Smith {
1142f1af5d2fSBarry Smith   Mat               A  = (Mat) Aa;
1143f1af5d2fSBarry Smith   Mat_SeqDense      *a = (Mat_SeqDense*)A->data;
11446849ba73SBarry Smith   PetscErrorCode    ierr;
1145d0f46423SBarry Smith   PetscInt          m  = A->rmap->n,n = A->cmap->n,color,i,j;
114687828ca2SBarry Smith   PetscScalar       *v = a->v;
1147b0a32e0cSBarry Smith   PetscViewer       viewer;
1148b0a32e0cSBarry Smith   PetscDraw         popup;
1149329f5518SBarry Smith   PetscReal         xl,yl,xr,yr,x_l,x_r,y_l,y_r,scale,maxv = 0.0;
1150f3ef73ceSBarry Smith   PetscViewerFormat format;
1151f1af5d2fSBarry Smith 
1152f1af5d2fSBarry Smith   PetscFunctionBegin;
1153f1af5d2fSBarry Smith   ierr = PetscObjectQuery((PetscObject)A,"Zoomviewer",(PetscObject*)&viewer);CHKERRQ(ierr);
1154b0a32e0cSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
1155b0a32e0cSBarry Smith   ierr = PetscDrawGetCoordinates(draw,&xl,&yl,&xr,&yr);CHKERRQ(ierr);
1156f1af5d2fSBarry Smith 
1157f1af5d2fSBarry Smith   /* Loop over matrix elements drawing boxes */
1158fb9695e5SSatish Balay   if (format != PETSC_VIEWER_DRAW_CONTOUR) {
1159f1af5d2fSBarry Smith     /* Blue for negative and Red for positive */
1160b0a32e0cSBarry Smith     color = PETSC_DRAW_BLUE;
1161f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1162f1af5d2fSBarry Smith       x_l = j;
1163f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1164f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1165f1af5d2fSBarry Smith         y_l = m - i - 1.0;
1166f1af5d2fSBarry Smith         y_r = y_l + 1.0;
1167329f5518SBarry Smith         if (PetscRealPart(v[j*m+i]) >  0.) {
1168b0a32e0cSBarry Smith           color = PETSC_DRAW_RED;
1169329f5518SBarry Smith         } else if (PetscRealPart(v[j*m+i]) <  0.) {
1170b0a32e0cSBarry Smith           color = PETSC_DRAW_BLUE;
1171f1af5d2fSBarry Smith         } else {
1172f1af5d2fSBarry Smith           continue;
1173f1af5d2fSBarry Smith         }
1174b0a32e0cSBarry Smith         ierr = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1175f1af5d2fSBarry Smith       }
1176f1af5d2fSBarry Smith     }
1177f1af5d2fSBarry Smith   } else {
1178f1af5d2fSBarry Smith     /* use contour shading to indicate magnitude of values */
1179f1af5d2fSBarry Smith     /* first determine max of all nonzero values */
1180f1af5d2fSBarry Smith     for (i = 0; i < m*n; i++) {
1181f1af5d2fSBarry Smith       if (PetscAbsScalar(v[i]) > maxv) maxv = PetscAbsScalar(v[i]);
1182f1af5d2fSBarry Smith     }
1183b0a32e0cSBarry Smith     scale = (245.0 - PETSC_DRAW_BASIC_COLORS)/maxv;
1184b0a32e0cSBarry Smith     ierr  = PetscDrawGetPopup(draw,&popup);CHKERRQ(ierr);
1185b0a32e0cSBarry Smith     if (popup) {ierr = PetscDrawScalePopup(popup,0.0,maxv);CHKERRQ(ierr);}
1186f1af5d2fSBarry Smith     for (j = 0; j < n; j++) {
1187f1af5d2fSBarry Smith       x_l = j;
1188f1af5d2fSBarry Smith       x_r = x_l + 1.0;
1189f1af5d2fSBarry Smith       for (i = 0; i < m; i++) {
1190f1af5d2fSBarry Smith         y_l   = m - i - 1.0;
1191f1af5d2fSBarry Smith         y_r   = y_l + 1.0;
1192b0a32e0cSBarry Smith         color = PETSC_DRAW_BASIC_COLORS + (int)(scale*PetscAbsScalar(v[j*m+i]));
1193b0a32e0cSBarry Smith         ierr  = PetscDrawRectangle(draw,x_l,y_l,x_r,y_r,color,color,color,color);CHKERRQ(ierr);
1194f1af5d2fSBarry Smith       }
1195f1af5d2fSBarry Smith     }
1196f1af5d2fSBarry Smith   }
1197f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1198f1af5d2fSBarry Smith }
1199f1af5d2fSBarry Smith 
12004a2ae208SSatish Balay #undef __FUNCT__
12014a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense_Draw"
1202dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense_Draw(Mat A,PetscViewer viewer)
1203f1af5d2fSBarry Smith {
1204b0a32e0cSBarry Smith   PetscDraw      draw;
1205ace3abfcSBarry Smith   PetscBool      isnull;
1206329f5518SBarry Smith   PetscReal      xr,yr,xl,yl,h,w;
1207dfbe8321SBarry Smith   PetscErrorCode ierr;
1208f1af5d2fSBarry Smith 
1209f1af5d2fSBarry Smith   PetscFunctionBegin;
1210b0a32e0cSBarry Smith   ierr = PetscViewerDrawGetDraw(viewer,0,&draw);CHKERRQ(ierr);
1211b0a32e0cSBarry Smith   ierr = PetscDrawIsNull(draw,&isnull);CHKERRQ(ierr);
1212abc0a331SBarry Smith   if (isnull) PetscFunctionReturn(0);
1213f1af5d2fSBarry Smith 
1214f1af5d2fSBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",(PetscObject)viewer);CHKERRQ(ierr);
1215d0f46423SBarry Smith   xr   = A->cmap->n; yr = A->rmap->n; h = yr/10.0; w = xr/10.0;
1216f1af5d2fSBarry Smith   xr  += w;    yr += h;  xl = -w;     yl = -h;
1217b0a32e0cSBarry Smith   ierr = PetscDrawSetCoordinates(draw,xl,yl,xr,yr);CHKERRQ(ierr);
1218b0a32e0cSBarry Smith   ierr = PetscDrawZoom(draw,MatView_SeqDense_Draw_Zoom,A);CHKERRQ(ierr);
12190298fd71SBarry Smith   ierr = PetscObjectCompose((PetscObject)A,"Zoomviewer",NULL);CHKERRQ(ierr);
1220f1af5d2fSBarry Smith   PetscFunctionReturn(0);
1221f1af5d2fSBarry Smith }
1222f1af5d2fSBarry Smith 
12234a2ae208SSatish Balay #undef __FUNCT__
12244a2ae208SSatish Balay #define __FUNCT__ "MatView_SeqDense"
1225dfbe8321SBarry Smith PetscErrorCode MatView_SeqDense(Mat A,PetscViewer viewer)
1226932b0c3eSLois Curfman McInnes {
1227dfbe8321SBarry Smith   PetscErrorCode ierr;
1228ace3abfcSBarry Smith   PetscBool      iascii,isbinary,isdraw;
1229932b0c3eSLois Curfman McInnes 
12303a40ed3dSBarry Smith   PetscFunctionBegin;
1231251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&iascii);CHKERRQ(ierr);
1232251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERBINARY,&isbinary);CHKERRQ(ierr);
1233251f4c67SDmitry Karpeev   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERDRAW,&isdraw);CHKERRQ(ierr);
12340f5bd95cSBarry Smith 
1235c45a1595SBarry Smith   if (iascii) {
1236c45a1595SBarry Smith     ierr = MatView_SeqDense_ASCII(A,viewer);CHKERRQ(ierr);
12370f5bd95cSBarry Smith   } else if (isbinary) {
12383a40ed3dSBarry Smith     ierr = MatView_SeqDense_Binary(A,viewer);CHKERRQ(ierr);
1239f1af5d2fSBarry Smith   } else if (isdraw) {
1240f1af5d2fSBarry Smith     ierr = MatView_SeqDense_Draw(A,viewer);CHKERRQ(ierr);
1241932b0c3eSLois Curfman McInnes   }
12423a40ed3dSBarry Smith   PetscFunctionReturn(0);
1243932b0c3eSLois Curfman McInnes }
1244289bc588SBarry Smith 
12454a2ae208SSatish Balay #undef __FUNCT__
12464a2ae208SSatish Balay #define __FUNCT__ "MatDestroy_SeqDense"
1247dfbe8321SBarry Smith PetscErrorCode MatDestroy_SeqDense(Mat mat)
1248289bc588SBarry Smith {
1249ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)mat->data;
1250dfbe8321SBarry Smith   PetscErrorCode ierr;
125190f02eecSBarry Smith 
12523a40ed3dSBarry Smith   PetscFunctionBegin;
1253aa482453SBarry Smith #if defined(PETSC_USE_LOG)
1254d0f46423SBarry Smith   PetscLogObjectState((PetscObject)mat,"Rows %D Cols %D",mat->rmap->n,mat->cmap->n);
1255a5a9c739SBarry Smith #endif
125605b42c5fSBarry Smith   ierr = PetscFree(l->pivots);CHKERRQ(ierr);
1257*abc3b08eSStefano Zampini   ierr = MatDestroy(&l->ptapwork);CHKERRQ(ierr);
12586857c123SSatish Balay   if (!l->user_alloc) {ierr = PetscFree(l->v);CHKERRQ(ierr);}
1259bf0cc555SLisandro Dalcin   ierr = PetscFree(mat->data);CHKERRQ(ierr);
1260dbd8c25aSHong Zhang 
1261dbd8c25aSHong Zhang   ierr = PetscObjectChangeTypeName((PetscObject)mat,0);CHKERRQ(ierr);
1262bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseGetArray_C",NULL);CHKERRQ(ierr);
1263bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatDenseRestoreArray_C",NULL);CHKERRQ(ierr);
12648baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_seqaij_C",NULL);CHKERRQ(ierr);
12658baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
12668baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatConvert_seqdense_elemental_C",NULL);CHKERRQ(ierr);
12678baccfbdSHong Zhang #endif
1268bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatSeqDenseSetPreallocation_C",NULL);CHKERRQ(ierr);
1269bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1270bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1271bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
1272*abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatPtAP_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12733bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMult_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12743bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12753bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)mat,"MatTransposeMatMultNumeric_seqaij_seqdense_C",NULL);CHKERRQ(ierr);
12763a40ed3dSBarry Smith   PetscFunctionReturn(0);
1277289bc588SBarry Smith }
1278289bc588SBarry Smith 
12794a2ae208SSatish Balay #undef __FUNCT__
12804a2ae208SSatish Balay #define __FUNCT__ "MatTranspose_SeqDense"
1281fc4dec0aSBarry Smith PetscErrorCode MatTranspose_SeqDense(Mat A,MatReuse reuse,Mat *matout)
1282289bc588SBarry Smith {
1283c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
12846849ba73SBarry Smith   PetscErrorCode ierr;
128513f74950SBarry Smith   PetscInt       k,j,m,n,M;
128687828ca2SBarry Smith   PetscScalar    *v,tmp;
128748b35521SBarry Smith 
12883a40ed3dSBarry Smith   PetscFunctionBegin;
1289d0f46423SBarry Smith   v = mat->v; m = A->rmap->n; M = mat->lda; n = A->cmap->n;
1290e9695a30SBarry Smith   if (reuse == MAT_REUSE_MATRIX && *matout == A) { /* in place transpose */
1291e7e72b3dSBarry Smith     if (m != n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Can not transpose non-square matrix in place");
1292e7e72b3dSBarry Smith     else {
1293d3e5ee88SLois Curfman McInnes       for (j=0; j<m; j++) {
1294289bc588SBarry Smith         for (k=0; k<j; k++) {
12951b807ce4Svictorle           tmp        = v[j + k*M];
12961b807ce4Svictorle           v[j + k*M] = v[k + j*M];
12971b807ce4Svictorle           v[k + j*M] = tmp;
1298289bc588SBarry Smith         }
1299289bc588SBarry Smith       }
1300d64ed03dSBarry Smith     }
13013a40ed3dSBarry Smith   } else { /* out-of-place transpose */
1302d3e5ee88SLois Curfman McInnes     Mat          tmat;
1303ec8511deSBarry Smith     Mat_SeqDense *tmatd;
130487828ca2SBarry Smith     PetscScalar  *v2;
1305af36a384SStefano Zampini     PetscInt     M2;
1306ea709b57SSatish Balay 
1307fc4dec0aSBarry Smith     if (reuse == MAT_INITIAL_MATRIX) {
1308ce94432eSBarry Smith       ierr = MatCreate(PetscObjectComm((PetscObject)A),&tmat);CHKERRQ(ierr);
1309d0f46423SBarry Smith       ierr = MatSetSizes(tmat,A->cmap->n,A->rmap->n,A->cmap->n,A->rmap->n);CHKERRQ(ierr);
13107adad957SLisandro Dalcin       ierr = MatSetType(tmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
13110298fd71SBarry Smith       ierr = MatSeqDenseSetPreallocation(tmat,NULL);CHKERRQ(ierr);
1312fc4dec0aSBarry Smith     } else {
1313fc4dec0aSBarry Smith       tmat = *matout;
1314fc4dec0aSBarry Smith     }
1315ec8511deSBarry Smith     tmatd = (Mat_SeqDense*)tmat->data;
1316af36a384SStefano Zampini     v = mat->v; v2 = tmatd->v; M2 = tmatd->lda;
1317d3e5ee88SLois Curfman McInnes     for (j=0; j<n; j++) {
1318af36a384SStefano Zampini       for (k=0; k<m; k++) v2[j + k*M2] = v[k + j*M];
1319d3e5ee88SLois Curfman McInnes     }
13206d4a8577SBarry Smith     ierr = MatAssemblyBegin(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
13216d4a8577SBarry Smith     ierr = MatAssemblyEnd(tmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
1322d3e5ee88SLois Curfman McInnes     *matout = tmat;
132348b35521SBarry Smith   }
13243a40ed3dSBarry Smith   PetscFunctionReturn(0);
1325289bc588SBarry Smith }
1326289bc588SBarry Smith 
13274a2ae208SSatish Balay #undef __FUNCT__
13284a2ae208SSatish Balay #define __FUNCT__ "MatEqual_SeqDense"
1329ace3abfcSBarry Smith PetscErrorCode MatEqual_SeqDense(Mat A1,Mat A2,PetscBool  *flg)
1330289bc588SBarry Smith {
1331c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat1 = (Mat_SeqDense*)A1->data;
1332c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat2 = (Mat_SeqDense*)A2->data;
133313f74950SBarry Smith   PetscInt     i,j;
1334a2ea699eSBarry Smith   PetscScalar  *v1,*v2;
13359ea5d5aeSSatish Balay 
13363a40ed3dSBarry Smith   PetscFunctionBegin;
1337d0f46423SBarry Smith   if (A1->rmap->n != A2->rmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1338d0f46423SBarry Smith   if (A1->cmap->n != A2->cmap->n) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
1339d0f46423SBarry Smith   for (i=0; i<A1->rmap->n; i++) {
13401b807ce4Svictorle     v1 = mat1->v+i; v2 = mat2->v+i;
1341d0f46423SBarry Smith     for (j=0; j<A1->cmap->n; j++) {
13423a40ed3dSBarry Smith       if (*v1 != *v2) {*flg = PETSC_FALSE; PetscFunctionReturn(0);}
13431b807ce4Svictorle       v1 += mat1->lda; v2 += mat2->lda;
13441b807ce4Svictorle     }
1345289bc588SBarry Smith   }
134677c4ece6SBarry Smith   *flg = PETSC_TRUE;
13473a40ed3dSBarry Smith   PetscFunctionReturn(0);
1348289bc588SBarry Smith }
1349289bc588SBarry Smith 
13504a2ae208SSatish Balay #undef __FUNCT__
13514a2ae208SSatish Balay #define __FUNCT__ "MatGetDiagonal_SeqDense"
1352dfbe8321SBarry Smith PetscErrorCode MatGetDiagonal_SeqDense(Mat A,Vec v)
1353289bc588SBarry Smith {
1354c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
1355dfbe8321SBarry Smith   PetscErrorCode ierr;
135613f74950SBarry Smith   PetscInt       i,n,len;
135787828ca2SBarry Smith   PetscScalar    *x,zero = 0.0;
135844cd7ae7SLois Curfman McInnes 
13593a40ed3dSBarry Smith   PetscFunctionBegin;
13602dcb1b2aSMatthew Knepley   ierr = VecSet(v,zero);CHKERRQ(ierr);
13617a97a34bSBarry Smith   ierr = VecGetSize(v,&n);CHKERRQ(ierr);
13621ebc52fbSHong Zhang   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1363d0f46423SBarry Smith   len  = PetscMin(A->rmap->n,A->cmap->n);
1364e32f2f54SBarry Smith   if (n != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming mat and vec");
136544cd7ae7SLois Curfman McInnes   for (i=0; i<len; i++) {
13661b807ce4Svictorle     x[i] = mat->v[i*mat->lda + i];
1367289bc588SBarry Smith   }
13681ebc52fbSHong Zhang   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
13693a40ed3dSBarry Smith   PetscFunctionReturn(0);
1370289bc588SBarry Smith }
1371289bc588SBarry Smith 
13724a2ae208SSatish Balay #undef __FUNCT__
13734a2ae208SSatish Balay #define __FUNCT__ "MatDiagonalScale_SeqDense"
1374dfbe8321SBarry Smith PetscErrorCode MatDiagonalScale_SeqDense(Mat A,Vec ll,Vec rr)
1375289bc588SBarry Smith {
1376c0bbcb79SLois Curfman McInnes   Mat_SeqDense      *mat = (Mat_SeqDense*)A->data;
1377f1ceaac6SMatthew G. Knepley   const PetscScalar *l,*r;
1378f1ceaac6SMatthew G. Knepley   PetscScalar       x,*v;
1379dfbe8321SBarry Smith   PetscErrorCode    ierr;
1380d0f46423SBarry Smith   PetscInt          i,j,m = A->rmap->n,n = A->cmap->n;
138155659b69SBarry Smith 
13823a40ed3dSBarry Smith   PetscFunctionBegin;
138328988994SBarry Smith   if (ll) {
13847a97a34bSBarry Smith     ierr = VecGetSize(ll,&m);CHKERRQ(ierr);
1385f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(ll,&l);CHKERRQ(ierr);
1386e32f2f54SBarry Smith     if (m != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Left scaling vec wrong size");
1387da3a660dSBarry Smith     for (i=0; i<m; i++) {
1388da3a660dSBarry Smith       x = l[i];
1389da3a660dSBarry Smith       v = mat->v + i;
1390b43bac26SStefano Zampini       for (j=0; j<n; j++) { (*v) *= x; v+= mat->lda;}
1391da3a660dSBarry Smith     }
1392f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(ll,&l);CHKERRQ(ierr);
1393eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1394da3a660dSBarry Smith   }
139528988994SBarry Smith   if (rr) {
13967a97a34bSBarry Smith     ierr = VecGetSize(rr,&n);CHKERRQ(ierr);
1397f1ceaac6SMatthew G. Knepley     ierr = VecGetArrayRead(rr,&r);CHKERRQ(ierr);
1398e32f2f54SBarry Smith     if (n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Right scaling vec wrong size");
1399da3a660dSBarry Smith     for (i=0; i<n; i++) {
1400da3a660dSBarry Smith       x = r[i];
1401b43bac26SStefano Zampini       v = mat->v + i*mat->lda;
14022205254eSKarl Rupp       for (j=0; j<m; j++) (*v++) *= x;
1403da3a660dSBarry Smith     }
1404f1ceaac6SMatthew G. Knepley     ierr = VecRestoreArrayRead(rr,&r);CHKERRQ(ierr);
1405eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*n*m);CHKERRQ(ierr);
1406da3a660dSBarry Smith   }
14073a40ed3dSBarry Smith   PetscFunctionReturn(0);
1408289bc588SBarry Smith }
1409289bc588SBarry Smith 
14104a2ae208SSatish Balay #undef __FUNCT__
14114a2ae208SSatish Balay #define __FUNCT__ "MatNorm_SeqDense"
1412dfbe8321SBarry Smith PetscErrorCode MatNorm_SeqDense(Mat A,NormType type,PetscReal *nrm)
1413289bc588SBarry Smith {
1414c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
141587828ca2SBarry Smith   PetscScalar    *v   = mat->v;
1416329f5518SBarry Smith   PetscReal      sum  = 0.0;
1417d0f46423SBarry Smith   PetscInt       lda  =mat->lda,m=A->rmap->n,i,j;
1418efee365bSSatish Balay   PetscErrorCode ierr;
141955659b69SBarry Smith 
14203a40ed3dSBarry Smith   PetscFunctionBegin;
1421289bc588SBarry Smith   if (type == NORM_FROBENIUS) {
1422a5ce6ee0Svictorle     if (lda>m) {
1423d0f46423SBarry Smith       for (j=0; j<A->cmap->n; j++) {
1424a5ce6ee0Svictorle         v = mat->v+j*lda;
1425a5ce6ee0Svictorle         for (i=0; i<m; i++) {
1426a5ce6ee0Svictorle           sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1427a5ce6ee0Svictorle         }
1428a5ce6ee0Svictorle       }
1429a5ce6ee0Svictorle     } else {
1430d0f46423SBarry Smith       for (i=0; i<A->cmap->n*A->rmap->n; i++) {
1431329f5518SBarry Smith         sum += PetscRealPart(PetscConj(*v)*(*v)); v++;
1432289bc588SBarry Smith       }
1433a5ce6ee0Svictorle     }
14348f1a2a5eSBarry Smith     *nrm = PetscSqrtReal(sum);
1435dc0b31edSSatish Balay     ierr = PetscLogFlops(2.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
14363a40ed3dSBarry Smith   } else if (type == NORM_1) {
1437064f8208SBarry Smith     *nrm = 0.0;
1438d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
14391b807ce4Svictorle       v   = mat->v + j*mat->lda;
1440289bc588SBarry Smith       sum = 0.0;
1441d0f46423SBarry Smith       for (i=0; i<A->rmap->n; i++) {
144233a8263dSBarry Smith         sum += PetscAbsScalar(*v);  v++;
1443289bc588SBarry Smith       }
1444064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1445289bc588SBarry Smith     }
1446eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
14473a40ed3dSBarry Smith   } else if (type == NORM_INFINITY) {
1448064f8208SBarry Smith     *nrm = 0.0;
1449d0f46423SBarry Smith     for (j=0; j<A->rmap->n; j++) {
1450289bc588SBarry Smith       v   = mat->v + j;
1451289bc588SBarry Smith       sum = 0.0;
1452d0f46423SBarry Smith       for (i=0; i<A->cmap->n; i++) {
14531b807ce4Svictorle         sum += PetscAbsScalar(*v); v += mat->lda;
1454289bc588SBarry Smith       }
1455064f8208SBarry Smith       if (sum > *nrm) *nrm = sum;
1456289bc588SBarry Smith     }
1457eb3f19e4SBarry Smith     ierr = PetscLogFlops(1.0*A->cmap->n*A->rmap->n);CHKERRQ(ierr);
1458e7e72b3dSBarry Smith   } else SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"No two norm");
14593a40ed3dSBarry Smith   PetscFunctionReturn(0);
1460289bc588SBarry Smith }
1461289bc588SBarry Smith 
14624a2ae208SSatish Balay #undef __FUNCT__
14634a2ae208SSatish Balay #define __FUNCT__ "MatSetOption_SeqDense"
1464ace3abfcSBarry Smith PetscErrorCode MatSetOption_SeqDense(Mat A,MatOption op,PetscBool flg)
1465289bc588SBarry Smith {
1466c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *aij = (Mat_SeqDense*)A->data;
146763ba0a88SBarry Smith   PetscErrorCode ierr;
146867e560aaSBarry Smith 
14693a40ed3dSBarry Smith   PetscFunctionBegin;
1470b5a2b587SKris Buschelman   switch (op) {
1471b5a2b587SKris Buschelman   case MAT_ROW_ORIENTED:
14724e0d8c25SBarry Smith     aij->roworiented = flg;
1473b5a2b587SKris Buschelman     break;
1474512a5fc5SBarry Smith   case MAT_NEW_NONZERO_LOCATIONS:
1475b5a2b587SKris Buschelman   case MAT_NEW_NONZERO_LOCATION_ERR:
14763971808eSMatthew Knepley   case MAT_NEW_NONZERO_ALLOCATION_ERR:
14774e0d8c25SBarry Smith   case MAT_NEW_DIAGONALS:
147813fa8e87SLisandro Dalcin   case MAT_KEEP_NONZERO_PATTERN:
1479b5a2b587SKris Buschelman   case MAT_IGNORE_OFF_PROC_ENTRIES:
1480b5a2b587SKris Buschelman   case MAT_USE_HASH_TABLE:
14815021d80fSJed Brown   case MAT_IGNORE_LOWER_TRIANGULAR:
14825021d80fSJed Brown     ierr = PetscInfo1(A,"Option %s ignored\n",MatOptions[op]);CHKERRQ(ierr);
14835021d80fSJed Brown     break;
14845021d80fSJed Brown   case MAT_SPD:
148577e54ba9SKris Buschelman   case MAT_SYMMETRIC:
148677e54ba9SKris Buschelman   case MAT_STRUCTURALLY_SYMMETRIC:
14879a4540c5SBarry Smith   case MAT_HERMITIAN:
14889a4540c5SBarry Smith   case MAT_SYMMETRY_ETERNAL:
14895021d80fSJed Brown     /* These options are handled directly by MatSetOption() */
149077e54ba9SKris Buschelman     break;
1491b5a2b587SKris Buschelman   default:
1492e32f2f54SBarry Smith     SETERRQ1(PETSC_COMM_SELF,PETSC_ERR_SUP,"unknown option %s",MatOptions[op]);
14933a40ed3dSBarry Smith   }
14943a40ed3dSBarry Smith   PetscFunctionReturn(0);
1495289bc588SBarry Smith }
1496289bc588SBarry Smith 
14974a2ae208SSatish Balay #undef __FUNCT__
14984a2ae208SSatish Balay #define __FUNCT__ "MatZeroEntries_SeqDense"
1499dfbe8321SBarry Smith PetscErrorCode MatZeroEntries_SeqDense(Mat A)
15006f0a148fSBarry Smith {
1501ec8511deSBarry Smith   Mat_SeqDense   *l = (Mat_SeqDense*)A->data;
15026849ba73SBarry Smith   PetscErrorCode ierr;
1503d0f46423SBarry Smith   PetscInt       lda=l->lda,m=A->rmap->n,j;
15043a40ed3dSBarry Smith 
15053a40ed3dSBarry Smith   PetscFunctionBegin;
1506a5ce6ee0Svictorle   if (lda>m) {
1507d0f46423SBarry Smith     for (j=0; j<A->cmap->n; j++) {
1508a5ce6ee0Svictorle       ierr = PetscMemzero(l->v+j*lda,m*sizeof(PetscScalar));CHKERRQ(ierr);
1509a5ce6ee0Svictorle     }
1510a5ce6ee0Svictorle   } else {
1511d0f46423SBarry Smith     ierr = PetscMemzero(l->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1512a5ce6ee0Svictorle   }
15133a40ed3dSBarry Smith   PetscFunctionReturn(0);
15146f0a148fSBarry Smith }
15156f0a148fSBarry Smith 
15164a2ae208SSatish Balay #undef __FUNCT__
15174a2ae208SSatish Balay #define __FUNCT__ "MatZeroRows_SeqDense"
15182b40b63fSBarry Smith PetscErrorCode MatZeroRows_SeqDense(Mat A,PetscInt N,const PetscInt rows[],PetscScalar diag,Vec x,Vec b)
15196f0a148fSBarry Smith {
152097b48c8fSBarry Smith   PetscErrorCode    ierr;
1521ec8511deSBarry Smith   Mat_SeqDense      *l = (Mat_SeqDense*)A->data;
1522b9679d65SBarry Smith   PetscInt          m  = l->lda, n = A->cmap->n, i,j;
152397b48c8fSBarry Smith   PetscScalar       *slot,*bb;
152497b48c8fSBarry Smith   const PetscScalar *xx;
152555659b69SBarry Smith 
15263a40ed3dSBarry Smith   PetscFunctionBegin;
1527b9679d65SBarry Smith #if defined(PETSC_USE_DEBUG)
1528b9679d65SBarry Smith   for (i=0; i<N; i++) {
1529b9679d65SBarry Smith     if (rows[i] < 0) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_OUTOFRANGE,"Negative row requested to be zeroed");
1530b9679d65SBarry 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);
1531b9679d65SBarry Smith   }
1532b9679d65SBarry Smith #endif
1533b9679d65SBarry Smith 
153497b48c8fSBarry Smith   /* fix right hand side if needed */
153597b48c8fSBarry Smith   if (x && b) {
153697b48c8fSBarry Smith     ierr = VecGetArrayRead(x,&xx);CHKERRQ(ierr);
153797b48c8fSBarry Smith     ierr = VecGetArray(b,&bb);CHKERRQ(ierr);
15382205254eSKarl Rupp     for (i=0; i<N; i++) bb[rows[i]] = diag*xx[rows[i]];
153997b48c8fSBarry Smith     ierr = VecRestoreArrayRead(x,&xx);CHKERRQ(ierr);
154097b48c8fSBarry Smith     ierr = VecRestoreArray(b,&bb);CHKERRQ(ierr);
154197b48c8fSBarry Smith   }
154297b48c8fSBarry Smith 
15436f0a148fSBarry Smith   for (i=0; i<N; i++) {
15446f0a148fSBarry Smith     slot = l->v + rows[i];
1545b9679d65SBarry Smith     for (j=0; j<n; j++) { *slot = 0.0; slot += m;}
15466f0a148fSBarry Smith   }
1547f4df32b1SMatthew Knepley   if (diag != 0.0) {
1548b9679d65SBarry Smith     if (A->rmap->n != A->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_SUP,"Only coded for square matrices");
15496f0a148fSBarry Smith     for (i=0; i<N; i++) {
1550b9679d65SBarry Smith       slot  = l->v + (m+1)*rows[i];
1551f4df32b1SMatthew Knepley       *slot = diag;
15526f0a148fSBarry Smith     }
15536f0a148fSBarry Smith   }
15543a40ed3dSBarry Smith   PetscFunctionReturn(0);
15556f0a148fSBarry Smith }
1556557bce09SLois Curfman McInnes 
15574a2ae208SSatish Balay #undef __FUNCT__
15588c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray_SeqDense"
15598c778c55SBarry Smith PetscErrorCode MatDenseGetArray_SeqDense(Mat A,PetscScalar *array[])
156064e87e97SBarry Smith {
1561c0bbcb79SLois Curfman McInnes   Mat_SeqDense *mat = (Mat_SeqDense*)A->data;
15623a40ed3dSBarry Smith 
15633a40ed3dSBarry Smith   PetscFunctionBegin;
1564e32f2f54SBarry 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");
156564e87e97SBarry Smith   *array = mat->v;
15663a40ed3dSBarry Smith   PetscFunctionReturn(0);
156764e87e97SBarry Smith }
15680754003eSLois Curfman McInnes 
15694a2ae208SSatish Balay #undef __FUNCT__
15708c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray_SeqDense"
15718c778c55SBarry Smith PetscErrorCode MatDenseRestoreArray_SeqDense(Mat A,PetscScalar *array[])
1572ff14e315SSatish Balay {
15733a40ed3dSBarry Smith   PetscFunctionBegin;
157409b544d4SBarry Smith   *array = 0; /* user cannot accidently use the array later */
15753a40ed3dSBarry Smith   PetscFunctionReturn(0);
1576ff14e315SSatish Balay }
15770754003eSLois Curfman McInnes 
15784a2ae208SSatish Balay #undef __FUNCT__
15798c778c55SBarry Smith #define __FUNCT__ "MatDenseGetArray"
1580dec5eb66SMatthew G Knepley /*@C
15818c778c55SBarry Smith    MatDenseGetArray - gives access to the array where the data for a SeqDense matrix is stored
158273a71a0fSBarry Smith 
158373a71a0fSBarry Smith    Not Collective
158473a71a0fSBarry Smith 
158573a71a0fSBarry Smith    Input Parameter:
1586579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
158773a71a0fSBarry Smith 
158873a71a0fSBarry Smith    Output Parameter:
158973a71a0fSBarry Smith .   array - pointer to the data
159073a71a0fSBarry Smith 
159173a71a0fSBarry Smith    Level: intermediate
159273a71a0fSBarry Smith 
15938c778c55SBarry Smith .seealso: MatDenseRestoreArray()
159473a71a0fSBarry Smith @*/
15958c778c55SBarry Smith PetscErrorCode  MatDenseGetArray(Mat A,PetscScalar **array)
159673a71a0fSBarry Smith {
159773a71a0fSBarry Smith   PetscErrorCode ierr;
159873a71a0fSBarry Smith 
159973a71a0fSBarry Smith   PetscFunctionBegin;
16008c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseGetArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
160173a71a0fSBarry Smith   PetscFunctionReturn(0);
160273a71a0fSBarry Smith }
160373a71a0fSBarry Smith 
160473a71a0fSBarry Smith #undef __FUNCT__
16058c778c55SBarry Smith #define __FUNCT__ "MatDenseRestoreArray"
1606dec5eb66SMatthew G Knepley /*@C
1607579dbff0SBarry Smith    MatDenseRestoreArray - returns access to the array where the data for a dense matrix is stored obtained by MatDenseGetArray()
160873a71a0fSBarry Smith 
160973a71a0fSBarry Smith    Not Collective
161073a71a0fSBarry Smith 
161173a71a0fSBarry Smith    Input Parameters:
1612579dbff0SBarry Smith .  mat - a MATSEQDENSE or MATMPIDENSE matrix
161373a71a0fSBarry Smith .  array - pointer to the data
161473a71a0fSBarry Smith 
161573a71a0fSBarry Smith    Level: intermediate
161673a71a0fSBarry Smith 
16178c778c55SBarry Smith .seealso: MatDenseGetArray()
161873a71a0fSBarry Smith @*/
16198c778c55SBarry Smith PetscErrorCode  MatDenseRestoreArray(Mat A,PetscScalar **array)
162073a71a0fSBarry Smith {
162173a71a0fSBarry Smith   PetscErrorCode ierr;
162273a71a0fSBarry Smith 
162373a71a0fSBarry Smith   PetscFunctionBegin;
16248c778c55SBarry Smith   ierr = PetscUseMethod(A,"MatDenseRestoreArray_C",(Mat,PetscScalar**),(A,array));CHKERRQ(ierr);
162573a71a0fSBarry Smith   PetscFunctionReturn(0);
162673a71a0fSBarry Smith }
162773a71a0fSBarry Smith 
162873a71a0fSBarry Smith #undef __FUNCT__
16294a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrix_SeqDense"
163013f74950SBarry Smith static PetscErrorCode MatGetSubMatrix_SeqDense(Mat A,IS isrow,IS iscol,PetscInt cs,MatReuse scall,Mat *B)
16310754003eSLois Curfman McInnes {
1632c0bbcb79SLois Curfman McInnes   Mat_SeqDense   *mat = (Mat_SeqDense*)A->data;
16336849ba73SBarry Smith   PetscErrorCode ierr;
16345d0c19d7SBarry Smith   PetscInt       i,j,nrows,ncols;
16355d0c19d7SBarry Smith   const PetscInt *irow,*icol;
163687828ca2SBarry Smith   PetscScalar    *av,*bv,*v = mat->v;
16370754003eSLois Curfman McInnes   Mat            newmat;
16380754003eSLois Curfman McInnes 
16393a40ed3dSBarry Smith   PetscFunctionBegin;
164078b31e54SBarry Smith   ierr = ISGetIndices(isrow,&irow);CHKERRQ(ierr);
164178b31e54SBarry Smith   ierr = ISGetIndices(iscol,&icol);CHKERRQ(ierr);
1642e03a110bSBarry Smith   ierr = ISGetLocalSize(isrow,&nrows);CHKERRQ(ierr);
1643e03a110bSBarry Smith   ierr = ISGetLocalSize(iscol,&ncols);CHKERRQ(ierr);
16440754003eSLois Curfman McInnes 
1645182d2002SSatish Balay   /* Check submatrixcall */
1646182d2002SSatish Balay   if (scall == MAT_REUSE_MATRIX) {
164713f74950SBarry Smith     PetscInt n_cols,n_rows;
1648182d2002SSatish Balay     ierr = MatGetSize(*B,&n_rows,&n_cols);CHKERRQ(ierr);
164921a2c019SBarry Smith     if (n_rows != nrows || n_cols != ncols) {
1650f746d493SDmitry Karpeev       /* resize the result matrix to match number of requested rows/columns */
1651c61587bbSBarry Smith       ierr = MatSetSizes(*B,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
165221a2c019SBarry Smith     }
1653182d2002SSatish Balay     newmat = *B;
1654182d2002SSatish Balay   } else {
16550754003eSLois Curfman McInnes     /* Create and fill new matrix */
1656ce94432eSBarry Smith     ierr = MatCreate(PetscObjectComm((PetscObject)A),&newmat);CHKERRQ(ierr);
1657f69a0ea3SMatthew Knepley     ierr = MatSetSizes(newmat,nrows,ncols,nrows,ncols);CHKERRQ(ierr);
16587adad957SLisandro Dalcin     ierr = MatSetType(newmat,((PetscObject)A)->type_name);CHKERRQ(ierr);
16590298fd71SBarry Smith     ierr = MatSeqDenseSetPreallocation(newmat,NULL);CHKERRQ(ierr);
1660182d2002SSatish Balay   }
1661182d2002SSatish Balay 
1662182d2002SSatish Balay   /* Now extract the data pointers and do the copy,column at a time */
1663182d2002SSatish Balay   bv = ((Mat_SeqDense*)newmat->data)->v;
1664182d2002SSatish Balay 
1665182d2002SSatish Balay   for (i=0; i<ncols; i++) {
16666de62eeeSBarry Smith     av = v + mat->lda*icol[i];
16672205254eSKarl Rupp     for (j=0; j<nrows; j++) *bv++ = av[irow[j]];
16680754003eSLois Curfman McInnes   }
1669182d2002SSatish Balay 
1670182d2002SSatish Balay   /* Assemble the matrices so that the correct flags are set */
16716d4a8577SBarry Smith   ierr = MatAssemblyBegin(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
16726d4a8577SBarry Smith   ierr = MatAssemblyEnd(newmat,MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
16730754003eSLois Curfman McInnes 
16740754003eSLois Curfman McInnes   /* Free work space */
167578b31e54SBarry Smith   ierr = ISRestoreIndices(isrow,&irow);CHKERRQ(ierr);
167678b31e54SBarry Smith   ierr = ISRestoreIndices(iscol,&icol);CHKERRQ(ierr);
1677182d2002SSatish Balay   *B   = newmat;
16783a40ed3dSBarry Smith   PetscFunctionReturn(0);
16790754003eSLois Curfman McInnes }
16800754003eSLois Curfman McInnes 
16814a2ae208SSatish Balay #undef __FUNCT__
16824a2ae208SSatish Balay #define __FUNCT__ "MatGetSubMatrices_SeqDense"
168313f74950SBarry Smith PetscErrorCode MatGetSubMatrices_SeqDense(Mat A,PetscInt n,const IS irow[],const IS icol[],MatReuse scall,Mat *B[])
1684905e6a2fSBarry Smith {
16856849ba73SBarry Smith   PetscErrorCode ierr;
168613f74950SBarry Smith   PetscInt       i;
1687905e6a2fSBarry Smith 
16883a40ed3dSBarry Smith   PetscFunctionBegin;
1689905e6a2fSBarry Smith   if (scall == MAT_INITIAL_MATRIX) {
1690854ce69bSBarry Smith     ierr = PetscMalloc1(n+1,B);CHKERRQ(ierr);
1691905e6a2fSBarry Smith   }
1692905e6a2fSBarry Smith 
1693905e6a2fSBarry Smith   for (i=0; i<n; i++) {
16946a6a5d1dSBarry Smith     ierr = MatGetSubMatrix_SeqDense(A,irow[i],icol[i],PETSC_DECIDE,scall,&(*B)[i]);CHKERRQ(ierr);
1695905e6a2fSBarry Smith   }
16963a40ed3dSBarry Smith   PetscFunctionReturn(0);
1697905e6a2fSBarry Smith }
1698905e6a2fSBarry Smith 
16994a2ae208SSatish Balay #undef __FUNCT__
1700c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyBegin_SeqDense"
1701c0aa2d19SHong Zhang PetscErrorCode MatAssemblyBegin_SeqDense(Mat mat,MatAssemblyType mode)
1702c0aa2d19SHong Zhang {
1703c0aa2d19SHong Zhang   PetscFunctionBegin;
1704c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1705c0aa2d19SHong Zhang }
1706c0aa2d19SHong Zhang 
1707c0aa2d19SHong Zhang #undef __FUNCT__
1708c0aa2d19SHong Zhang #define __FUNCT__ "MatAssemblyEnd_SeqDense"
1709c0aa2d19SHong Zhang PetscErrorCode MatAssemblyEnd_SeqDense(Mat mat,MatAssemblyType mode)
1710c0aa2d19SHong Zhang {
1711c0aa2d19SHong Zhang   PetscFunctionBegin;
1712c0aa2d19SHong Zhang   PetscFunctionReturn(0);
1713c0aa2d19SHong Zhang }
1714c0aa2d19SHong Zhang 
1715c0aa2d19SHong Zhang #undef __FUNCT__
17164a2ae208SSatish Balay #define __FUNCT__ "MatCopy_SeqDense"
1717dfbe8321SBarry Smith PetscErrorCode MatCopy_SeqDense(Mat A,Mat B,MatStructure str)
17184b0e389bSBarry Smith {
17194b0e389bSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data,*b = (Mat_SeqDense*)B->data;
17206849ba73SBarry Smith   PetscErrorCode ierr;
1721d0f46423SBarry Smith   PetscInt       lda1=a->lda,lda2=b->lda, m=A->rmap->n,n=A->cmap->n, j;
17223a40ed3dSBarry Smith 
17233a40ed3dSBarry Smith   PetscFunctionBegin;
172433f4a19fSKris Buschelman   /* If the two matrices don't have the same copy implementation, they aren't compatible for fast copy. */
172533f4a19fSKris Buschelman   if (A->ops->copy != B->ops->copy) {
1726cb5b572fSBarry Smith     ierr = MatCopy_Basic(A,B,str);CHKERRQ(ierr);
17273a40ed3dSBarry Smith     PetscFunctionReturn(0);
17283a40ed3dSBarry Smith   }
1729e32f2f54SBarry Smith   if (m != B->rmap->n || n != B->cmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"size(B) != size(A)");
1730a5ce6ee0Svictorle   if (lda1>m || lda2>m) {
17310dbb7854Svictorle     for (j=0; j<n; j++) {
1732a5ce6ee0Svictorle       ierr = PetscMemcpy(b->v+j*lda2,a->v+j*lda1,m*sizeof(PetscScalar));CHKERRQ(ierr);
1733a5ce6ee0Svictorle     }
1734a5ce6ee0Svictorle   } else {
1735d0f46423SBarry Smith     ierr = PetscMemcpy(b->v,a->v,A->rmap->n*A->cmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
1736a5ce6ee0Svictorle   }
1737273d9f13SBarry Smith   PetscFunctionReturn(0);
1738273d9f13SBarry Smith }
1739273d9f13SBarry Smith 
17404a2ae208SSatish Balay #undef __FUNCT__
17414994cf47SJed Brown #define __FUNCT__ "MatSetUp_SeqDense"
17424994cf47SJed Brown PetscErrorCode MatSetUp_SeqDense(Mat A)
1743273d9f13SBarry Smith {
1744dfbe8321SBarry Smith   PetscErrorCode ierr;
1745273d9f13SBarry Smith 
1746273d9f13SBarry Smith   PetscFunctionBegin;
1747273d9f13SBarry Smith   ierr =  MatSeqDenseSetPreallocation(A,0);CHKERRQ(ierr);
17483a40ed3dSBarry Smith   PetscFunctionReturn(0);
17494b0e389bSBarry Smith }
17504b0e389bSBarry Smith 
1751284134d9SBarry Smith #undef __FUNCT__
1752ba337c44SJed Brown #define __FUNCT__ "MatConjugate_SeqDense"
1753ba337c44SJed Brown static PetscErrorCode MatConjugate_SeqDense(Mat A)
1754ba337c44SJed Brown {
1755ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1756ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1757ba337c44SJed Brown   PetscScalar  *aa = a->v;
1758ba337c44SJed Brown 
1759ba337c44SJed Brown   PetscFunctionBegin;
1760ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscConj(aa[i]);
1761ba337c44SJed Brown   PetscFunctionReturn(0);
1762ba337c44SJed Brown }
1763ba337c44SJed Brown 
1764ba337c44SJed Brown #undef __FUNCT__
1765ba337c44SJed Brown #define __FUNCT__ "MatRealPart_SeqDense"
1766ba337c44SJed Brown static PetscErrorCode MatRealPart_SeqDense(Mat A)
1767ba337c44SJed Brown {
1768ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1769ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1770ba337c44SJed Brown   PetscScalar  *aa = a->v;
1771ba337c44SJed Brown 
1772ba337c44SJed Brown   PetscFunctionBegin;
1773ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscRealPart(aa[i]);
1774ba337c44SJed Brown   PetscFunctionReturn(0);
1775ba337c44SJed Brown }
1776ba337c44SJed Brown 
1777ba337c44SJed Brown #undef __FUNCT__
1778ba337c44SJed Brown #define __FUNCT__ "MatImaginaryPart_SeqDense"
1779ba337c44SJed Brown static PetscErrorCode MatImaginaryPart_SeqDense(Mat A)
1780ba337c44SJed Brown {
1781ba337c44SJed Brown   Mat_SeqDense *a = (Mat_SeqDense*)A->data;
1782ba337c44SJed Brown   PetscInt     i,nz = A->rmap->n*A->cmap->n;
1783ba337c44SJed Brown   PetscScalar  *aa = a->v;
1784ba337c44SJed Brown 
1785ba337c44SJed Brown   PetscFunctionBegin;
1786ba337c44SJed Brown   for (i=0; i<nz; i++) aa[i] = PetscImaginaryPart(aa[i]);
1787ba337c44SJed Brown   PetscFunctionReturn(0);
1788ba337c44SJed Brown }
1789284134d9SBarry Smith 
1790a9fe9ddaSSatish Balay /* ----------------------------------------------------------------*/
1791a9fe9ddaSSatish Balay #undef __FUNCT__
1792a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMult_SeqDense_SeqDense"
1793a9fe9ddaSSatish Balay PetscErrorCode MatMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1794a9fe9ddaSSatish Balay {
1795a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1796a9fe9ddaSSatish Balay 
1797a9fe9ddaSSatish Balay   PetscFunctionBegin;
1798a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
17993ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1800a9fe9ddaSSatish Balay     ierr = MatMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
18013ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_MatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1802a9fe9ddaSSatish Balay   }
18033ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1804a9fe9ddaSSatish Balay   ierr = MatMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
18053ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_MatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1806a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1807a9fe9ddaSSatish Balay }
1808a9fe9ddaSSatish Balay 
1809a9fe9ddaSSatish Balay #undef __FUNCT__
1810a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultSymbolic_SeqDense_SeqDense"
1811a9fe9ddaSSatish Balay PetscErrorCode MatMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1812a9fe9ddaSSatish Balay {
1813ee16a9a1SHong Zhang   PetscErrorCode ierr;
1814d0f46423SBarry Smith   PetscInt       m=A->rmap->n,n=B->cmap->n;
1815ee16a9a1SHong Zhang   Mat            Cmat;
1816a9fe9ddaSSatish Balay 
1817ee16a9a1SHong Zhang   PetscFunctionBegin;
1818e32f2f54SBarry 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);
1819ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1820ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1821ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
18220298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
1823d73949e8SHong Zhang 
1824ee16a9a1SHong Zhang   *C = Cmat;
1825ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1826ee16a9a1SHong Zhang }
1827a9fe9ddaSSatish Balay 
182898a3b096SSatish Balay #undef __FUNCT__
1829a9fe9ddaSSatish Balay #define __FUNCT__ "MatMatMultNumeric_SeqDense_SeqDense"
1830a9fe9ddaSSatish Balay PetscErrorCode MatMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1831a9fe9ddaSSatish Balay {
1832a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1833a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1834a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
18350805154bSBarry Smith   PetscBLASInt   m,n,k;
1836a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1837c5df96a5SBarry Smith   PetscErrorCode ierr;
1838fd4e9aacSBarry Smith   PetscBool      flg;
1839a9fe9ddaSSatish Balay 
1840a9fe9ddaSSatish Balay   PetscFunctionBegin;
1841fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)B,MATSEQDENSE,&flg);CHKERRQ(ierr);
1842fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Second matrix must be dense");
1843fd4e9aacSBarry Smith 
1844fd4e9aacSBarry Smith   /* Handle case where where user provided the final C matrix rather than calling MatMatMult() with MAT_INITIAL_MATRIX*/
1845fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQAIJ,&flg);CHKERRQ(ierr);
1846fd4e9aacSBarry Smith   if (flg) {
1847fd4e9aacSBarry Smith     C->ops->matmultnumeric = MatMatMultNumeric_SeqAIJ_SeqDense;
1848fd4e9aacSBarry Smith     ierr = (*C->ops->matmultnumeric)(A,B,C);CHKERRQ(ierr);
1849fd4e9aacSBarry Smith     PetscFunctionReturn(0);
1850fd4e9aacSBarry Smith   }
1851fd4e9aacSBarry Smith 
1852fd4e9aacSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)A,MATSEQDENSE,&flg);CHKERRQ(ierr);
1853fd4e9aacSBarry Smith   if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"First matrix must be dense");
1854c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&m);CHKERRQ(ierr);
1855c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1856c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&k);CHKERRQ(ierr);
18575ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("N","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1858a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1859a9fe9ddaSSatish Balay }
1860a9fe9ddaSSatish Balay 
1861a9fe9ddaSSatish Balay #undef __FUNCT__
186275648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMult_SeqDense_SeqDense"
186375648e8dSHong Zhang PetscErrorCode MatTransposeMatMult_SeqDense_SeqDense(Mat A,Mat B,MatReuse scall,PetscReal fill,Mat *C)
1864a9fe9ddaSSatish Balay {
1865a9fe9ddaSSatish Balay   PetscErrorCode ierr;
1866a9fe9ddaSSatish Balay 
1867a9fe9ddaSSatish Balay   PetscFunctionBegin;
1868a9fe9ddaSSatish Balay   if (scall == MAT_INITIAL_MATRIX) {
18693ff4c91cSHong Zhang     ierr = PetscLogEventBegin(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
187075648e8dSHong Zhang     ierr = MatTransposeMatMultSymbolic_SeqDense_SeqDense(A,B,fill,C);CHKERRQ(ierr);
18713ff4c91cSHong Zhang     ierr = PetscLogEventEnd(MAT_TransposeMatMultSymbolic,A,B,0,0);CHKERRQ(ierr);
1872a9fe9ddaSSatish Balay   }
18733ff4c91cSHong Zhang   ierr = PetscLogEventBegin(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
187475648e8dSHong Zhang   ierr = MatTransposeMatMultNumeric_SeqDense_SeqDense(A,B,*C);CHKERRQ(ierr);
18753ff4c91cSHong Zhang   ierr = PetscLogEventEnd(MAT_TransposeMatMultNumeric,A,B,0,0);CHKERRQ(ierr);
1876a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1877a9fe9ddaSSatish Balay }
1878a9fe9ddaSSatish Balay 
1879a9fe9ddaSSatish Balay #undef __FUNCT__
188075648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultSymbolic_SeqDense_SeqDense"
188175648e8dSHong Zhang PetscErrorCode MatTransposeMatMultSymbolic_SeqDense_SeqDense(Mat A,Mat B,PetscReal fill,Mat *C)
1882a9fe9ddaSSatish Balay {
1883ee16a9a1SHong Zhang   PetscErrorCode ierr;
1884d0f46423SBarry Smith   PetscInt       m=A->cmap->n,n=B->cmap->n;
1885ee16a9a1SHong Zhang   Mat            Cmat;
1886a9fe9ddaSSatish Balay 
1887ee16a9a1SHong Zhang   PetscFunctionBegin;
1888e32f2f54SBarry 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);
1889ee16a9a1SHong Zhang   ierr = MatCreate(PETSC_COMM_SELF,&Cmat);CHKERRQ(ierr);
1890ee16a9a1SHong Zhang   ierr = MatSetSizes(Cmat,m,n,m,n);CHKERRQ(ierr);
1891ee16a9a1SHong Zhang   ierr = MatSetType(Cmat,MATSEQDENSE);CHKERRQ(ierr);
18920298fd71SBarry Smith   ierr = MatSeqDenseSetPreallocation(Cmat,NULL);CHKERRQ(ierr);
18932205254eSKarl Rupp 
1894ee16a9a1SHong Zhang   Cmat->assembled = PETSC_TRUE;
18952205254eSKarl Rupp 
1896ee16a9a1SHong Zhang   *C = Cmat;
1897ee16a9a1SHong Zhang   PetscFunctionReturn(0);
1898ee16a9a1SHong Zhang }
1899a9fe9ddaSSatish Balay 
1900a9fe9ddaSSatish Balay #undef __FUNCT__
190175648e8dSHong Zhang #define __FUNCT__ "MatTransposeMatMultNumeric_SeqDense_SeqDense"
190275648e8dSHong Zhang PetscErrorCode MatTransposeMatMultNumeric_SeqDense_SeqDense(Mat A,Mat B,Mat C)
1903a9fe9ddaSSatish Balay {
1904a9fe9ddaSSatish Balay   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1905a9fe9ddaSSatish Balay   Mat_SeqDense   *b = (Mat_SeqDense*)B->data;
1906a9fe9ddaSSatish Balay   Mat_SeqDense   *c = (Mat_SeqDense*)C->data;
19070805154bSBarry Smith   PetscBLASInt   m,n,k;
1908a9fe9ddaSSatish Balay   PetscScalar    _DOne=1.0,_DZero=0.0;
1909c5df96a5SBarry Smith   PetscErrorCode ierr;
1910a9fe9ddaSSatish Balay 
1911a9fe9ddaSSatish Balay   PetscFunctionBegin;
1912c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->cmap->n,&m);CHKERRQ(ierr);
1913c5df96a5SBarry Smith   ierr = PetscBLASIntCast(B->cmap->n,&n);CHKERRQ(ierr);
1914c5df96a5SBarry Smith   ierr = PetscBLASIntCast(A->rmap->n,&k);CHKERRQ(ierr);
19152fbe02b9SBarry Smith   /*
19162fbe02b9SBarry Smith      Note the m and n arguments below are the number rows and columns of A', not A!
19172fbe02b9SBarry Smith   */
19185ca1cc5dSStefano Zampini   PetscStackCallBLAS("BLASgemm",BLASgemm_("T","N",&m,&n,&k,&_DOne,a->v,&a->lda,b->v,&b->lda,&_DZero,c->v,&c->lda));
1919a9fe9ddaSSatish Balay   PetscFunctionReturn(0);
1920a9fe9ddaSSatish Balay }
1921985db425SBarry Smith 
1922985db425SBarry Smith #undef __FUNCT__
1923985db425SBarry Smith #define __FUNCT__ "MatGetRowMax_SeqDense"
1924985db425SBarry Smith PetscErrorCode MatGetRowMax_SeqDense(Mat A,Vec v,PetscInt idx[])
1925985db425SBarry Smith {
1926985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1927985db425SBarry Smith   PetscErrorCode ierr;
1928d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1929985db425SBarry Smith   PetscScalar    *x;
1930985db425SBarry Smith   MatScalar      *aa = a->v;
1931985db425SBarry Smith 
1932985db425SBarry Smith   PetscFunctionBegin;
1933e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1934985db425SBarry Smith 
1935985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1936985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1937985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1938e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1939985db425SBarry Smith   for (i=0; i<m; i++) {
1940985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1941985db425SBarry Smith     for (j=1; j<n; j++) {
1942985db425SBarry Smith       if (PetscRealPart(x[i]) < PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1943985db425SBarry Smith     }
1944985db425SBarry Smith   }
1945985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1946985db425SBarry Smith   PetscFunctionReturn(0);
1947985db425SBarry Smith }
1948985db425SBarry Smith 
1949985db425SBarry Smith #undef __FUNCT__
1950985db425SBarry Smith #define __FUNCT__ "MatGetRowMaxAbs_SeqDense"
1951985db425SBarry Smith PetscErrorCode MatGetRowMaxAbs_SeqDense(Mat A,Vec v,PetscInt idx[])
1952985db425SBarry Smith {
1953985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1954985db425SBarry Smith   PetscErrorCode ierr;
1955d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1956985db425SBarry Smith   PetscScalar    *x;
1957985db425SBarry Smith   PetscReal      atmp;
1958985db425SBarry Smith   MatScalar      *aa = a->v;
1959985db425SBarry Smith 
1960985db425SBarry Smith   PetscFunctionBegin;
1961e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1962985db425SBarry Smith 
1963985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1964985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1965985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1966e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1967985db425SBarry Smith   for (i=0; i<m; i++) {
19689189402eSHong Zhang     x[i] = PetscAbsScalar(aa[i]);
1969985db425SBarry Smith     for (j=1; j<n; j++) {
1970985db425SBarry Smith       atmp = PetscAbsScalar(aa[i+m*j]);
1971985db425SBarry Smith       if (PetscAbsScalar(x[i]) < atmp) {x[i] = atmp; if (idx) idx[i] = j;}
1972985db425SBarry Smith     }
1973985db425SBarry Smith   }
1974985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
1975985db425SBarry Smith   PetscFunctionReturn(0);
1976985db425SBarry Smith }
1977985db425SBarry Smith 
1978985db425SBarry Smith #undef __FUNCT__
1979985db425SBarry Smith #define __FUNCT__ "MatGetRowMin_SeqDense"
1980985db425SBarry Smith PetscErrorCode MatGetRowMin_SeqDense(Mat A,Vec v,PetscInt idx[])
1981985db425SBarry Smith {
1982985db425SBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
1983985db425SBarry Smith   PetscErrorCode ierr;
1984d0f46423SBarry Smith   PetscInt       i,j,m = A->rmap->n,n = A->cmap->n,p;
1985985db425SBarry Smith   PetscScalar    *x;
1986985db425SBarry Smith   MatScalar      *aa = a->v;
1987985db425SBarry Smith 
1988985db425SBarry Smith   PetscFunctionBegin;
1989e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
1990985db425SBarry Smith 
1991985db425SBarry Smith   ierr = VecSet(v,0.0);CHKERRQ(ierr);
1992985db425SBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
1993985db425SBarry Smith   ierr = VecGetLocalSize(v,&p);CHKERRQ(ierr);
1994e32f2f54SBarry Smith   if (p != A->rmap->n) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ,"Nonconforming matrix and vector");
1995985db425SBarry Smith   for (i=0; i<m; i++) {
1996985db425SBarry Smith     x[i] = aa[i]; if (idx) idx[i] = 0;
1997985db425SBarry Smith     for (j=1; j<n; j++) {
1998985db425SBarry Smith       if (PetscRealPart(x[i]) > PetscRealPart(aa[i+m*j])) {x[i] = aa[i + m*j]; if (idx) idx[i] = j;}
1999985db425SBarry Smith     }
2000985db425SBarry Smith   }
2001985db425SBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
2002985db425SBarry Smith   PetscFunctionReturn(0);
2003985db425SBarry Smith }
2004985db425SBarry Smith 
20058d0534beSBarry Smith #undef __FUNCT__
20068d0534beSBarry Smith #define __FUNCT__ "MatGetColumnVector_SeqDense"
20078d0534beSBarry Smith PetscErrorCode MatGetColumnVector_SeqDense(Mat A,Vec v,PetscInt col)
20088d0534beSBarry Smith {
20098d0534beSBarry Smith   Mat_SeqDense   *a = (Mat_SeqDense*)A->data;
20108d0534beSBarry Smith   PetscErrorCode ierr;
20118d0534beSBarry Smith   PetscScalar    *x;
20128d0534beSBarry Smith 
20138d0534beSBarry Smith   PetscFunctionBegin;
2014e32f2f54SBarry Smith   if (A->factortype) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONGSTATE,"Not for factored matrix");
20158d0534beSBarry Smith 
20168d0534beSBarry Smith   ierr = VecGetArray(v,&x);CHKERRQ(ierr);
2017d0f46423SBarry Smith   ierr = PetscMemcpy(x,a->v+col*a->lda,A->rmap->n*sizeof(PetscScalar));CHKERRQ(ierr);
20188d0534beSBarry Smith   ierr = VecRestoreArray(v,&x);CHKERRQ(ierr);
20198d0534beSBarry Smith   PetscFunctionReturn(0);
20208d0534beSBarry Smith }
20218d0534beSBarry Smith 
20220716a85fSBarry Smith 
20230716a85fSBarry Smith #undef __FUNCT__
20240716a85fSBarry Smith #define __FUNCT__ "MatGetColumnNorms_SeqDense"
20250716a85fSBarry Smith PetscErrorCode MatGetColumnNorms_SeqDense(Mat A,NormType type,PetscReal *norms)
20260716a85fSBarry Smith {
20270716a85fSBarry Smith   PetscErrorCode ierr;
20280716a85fSBarry Smith   PetscInt       i,j,m,n;
20290716a85fSBarry Smith   PetscScalar    *a;
20300716a85fSBarry Smith 
20310716a85fSBarry Smith   PetscFunctionBegin;
20320716a85fSBarry Smith   ierr = MatGetSize(A,&m,&n);CHKERRQ(ierr);
20330716a85fSBarry Smith   ierr = PetscMemzero(norms,n*sizeof(PetscReal));CHKERRQ(ierr);
20348c778c55SBarry Smith   ierr = MatDenseGetArray(A,&a);CHKERRQ(ierr);
20350716a85fSBarry Smith   if (type == NORM_2) {
20360716a85fSBarry Smith     for (i=0; i<n; i++) {
20370716a85fSBarry Smith       for (j=0; j<m; j++) {
20380716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]*a[j]);
20390716a85fSBarry Smith       }
20400716a85fSBarry Smith       a += m;
20410716a85fSBarry Smith     }
20420716a85fSBarry Smith   } else if (type == NORM_1) {
20430716a85fSBarry Smith     for (i=0; i<n; i++) {
20440716a85fSBarry Smith       for (j=0; j<m; j++) {
20450716a85fSBarry Smith         norms[i] += PetscAbsScalar(a[j]);
20460716a85fSBarry Smith       }
20470716a85fSBarry Smith       a += m;
20480716a85fSBarry Smith     }
20490716a85fSBarry Smith   } else if (type == NORM_INFINITY) {
20500716a85fSBarry Smith     for (i=0; i<n; i++) {
20510716a85fSBarry Smith       for (j=0; j<m; j++) {
20520716a85fSBarry Smith         norms[i] = PetscMax(PetscAbsScalar(a[j]),norms[i]);
20530716a85fSBarry Smith       }
20540716a85fSBarry Smith       a += m;
20550716a85fSBarry Smith     }
2056ce94432eSBarry Smith   } else SETERRQ(PetscObjectComm((PetscObject)A),PETSC_ERR_ARG_WRONG,"Unknown NormType");
20578c778c55SBarry Smith   ierr = MatDenseRestoreArray(A,&a);CHKERRQ(ierr);
20580716a85fSBarry Smith   if (type == NORM_2) {
20598f1a2a5eSBarry Smith     for (i=0; i<n; i++) norms[i] = PetscSqrtReal(norms[i]);
20600716a85fSBarry Smith   }
20610716a85fSBarry Smith   PetscFunctionReturn(0);
20620716a85fSBarry Smith }
20630716a85fSBarry Smith 
206473a71a0fSBarry Smith #undef __FUNCT__
206573a71a0fSBarry Smith #define __FUNCT__ "MatSetRandom_SeqDense"
206673a71a0fSBarry Smith static PetscErrorCode  MatSetRandom_SeqDense(Mat x,PetscRandom rctx)
206773a71a0fSBarry Smith {
206873a71a0fSBarry Smith   PetscErrorCode ierr;
206973a71a0fSBarry Smith   PetscScalar    *a;
207073a71a0fSBarry Smith   PetscInt       m,n,i;
207173a71a0fSBarry Smith 
207273a71a0fSBarry Smith   PetscFunctionBegin;
207373a71a0fSBarry Smith   ierr = MatGetSize(x,&m,&n);CHKERRQ(ierr);
20748c778c55SBarry Smith   ierr = MatDenseGetArray(x,&a);CHKERRQ(ierr);
207573a71a0fSBarry Smith   for (i=0; i<m*n; i++) {
207673a71a0fSBarry Smith     ierr = PetscRandomGetValue(rctx,a+i);CHKERRQ(ierr);
207773a71a0fSBarry Smith   }
20788c778c55SBarry Smith   ierr = MatDenseRestoreArray(x,&a);CHKERRQ(ierr);
207973a71a0fSBarry Smith   PetscFunctionReturn(0);
208073a71a0fSBarry Smith }
208173a71a0fSBarry Smith 
20823b49f96aSBarry Smith #undef __FUNCT__
20833b49f96aSBarry Smith #define __FUNCT__ "MatMissingDiagonal_SeqDense"
20843b49f96aSBarry Smith static PetscErrorCode MatMissingDiagonal_SeqDense(Mat A,PetscBool  *missing,PetscInt *d)
20853b49f96aSBarry Smith {
20863b49f96aSBarry Smith   PetscFunctionBegin;
20873b49f96aSBarry Smith   *missing = PETSC_FALSE;
20883b49f96aSBarry Smith   PetscFunctionReturn(0);
20893b49f96aSBarry Smith }
209073a71a0fSBarry Smith 
2091*abc3b08eSStefano Zampini 
2092289bc588SBarry Smith /* -------------------------------------------------------------------*/
2093a5ae1ecdSBarry Smith static struct _MatOps MatOps_Values = { MatSetValues_SeqDense,
2094905e6a2fSBarry Smith                                         MatGetRow_SeqDense,
2095905e6a2fSBarry Smith                                         MatRestoreRow_SeqDense,
2096905e6a2fSBarry Smith                                         MatMult_SeqDense,
209797304618SKris Buschelman                                 /*  4*/ MatMultAdd_SeqDense,
20987c922b88SBarry Smith                                         MatMultTranspose_SeqDense,
20997c922b88SBarry Smith                                         MatMultTransposeAdd_SeqDense,
2100db4efbfdSBarry Smith                                         0,
2101db4efbfdSBarry Smith                                         0,
2102db4efbfdSBarry Smith                                         0,
2103db4efbfdSBarry Smith                                 /* 10*/ 0,
2104905e6a2fSBarry Smith                                         MatLUFactor_SeqDense,
2105905e6a2fSBarry Smith                                         MatCholeskyFactor_SeqDense,
210641f059aeSBarry Smith                                         MatSOR_SeqDense,
2107ec8511deSBarry Smith                                         MatTranspose_SeqDense,
210897304618SKris Buschelman                                 /* 15*/ MatGetInfo_SeqDense,
2109905e6a2fSBarry Smith                                         MatEqual_SeqDense,
2110905e6a2fSBarry Smith                                         MatGetDiagonal_SeqDense,
2111905e6a2fSBarry Smith                                         MatDiagonalScale_SeqDense,
2112905e6a2fSBarry Smith                                         MatNorm_SeqDense,
2113c0aa2d19SHong Zhang                                 /* 20*/ MatAssemblyBegin_SeqDense,
2114c0aa2d19SHong Zhang                                         MatAssemblyEnd_SeqDense,
2115905e6a2fSBarry Smith                                         MatSetOption_SeqDense,
2116905e6a2fSBarry Smith                                         MatZeroEntries_SeqDense,
2117d519adbfSMatthew Knepley                                 /* 24*/ MatZeroRows_SeqDense,
2118db4efbfdSBarry Smith                                         0,
2119db4efbfdSBarry Smith                                         0,
2120db4efbfdSBarry Smith                                         0,
2121db4efbfdSBarry Smith                                         0,
21224994cf47SJed Brown                                 /* 29*/ MatSetUp_SeqDense,
2123273d9f13SBarry Smith                                         0,
2124905e6a2fSBarry Smith                                         0,
212573a71a0fSBarry Smith                                         0,
212673a71a0fSBarry Smith                                         0,
2127d519adbfSMatthew Knepley                                 /* 34*/ MatDuplicate_SeqDense,
2128a5ae1ecdSBarry Smith                                         0,
2129a5ae1ecdSBarry Smith                                         0,
2130a5ae1ecdSBarry Smith                                         0,
2131a5ae1ecdSBarry Smith                                         0,
2132d519adbfSMatthew Knepley                                 /* 39*/ MatAXPY_SeqDense,
2133a5ae1ecdSBarry Smith                                         MatGetSubMatrices_SeqDense,
2134a5ae1ecdSBarry Smith                                         0,
21354b0e389bSBarry Smith                                         MatGetValues_SeqDense,
2136a5ae1ecdSBarry Smith                                         MatCopy_SeqDense,
2137d519adbfSMatthew Knepley                                 /* 44*/ MatGetRowMax_SeqDense,
2138a5ae1ecdSBarry Smith                                         MatScale_SeqDense,
21397d68702bSBarry Smith                                         MatShift_Basic,
2140a5ae1ecdSBarry Smith                                         0,
2141a5ae1ecdSBarry Smith                                         0,
214273a71a0fSBarry Smith                                 /* 49*/ MatSetRandom_SeqDense,
2143a5ae1ecdSBarry Smith                                         0,
2144a5ae1ecdSBarry Smith                                         0,
2145a5ae1ecdSBarry Smith                                         0,
2146a5ae1ecdSBarry Smith                                         0,
2147d519adbfSMatthew Knepley                                 /* 54*/ 0,
2148a5ae1ecdSBarry Smith                                         0,
2149a5ae1ecdSBarry Smith                                         0,
2150a5ae1ecdSBarry Smith                                         0,
2151a5ae1ecdSBarry Smith                                         0,
2152d519adbfSMatthew Knepley                                 /* 59*/ 0,
2153e03a110bSBarry Smith                                         MatDestroy_SeqDense,
2154e03a110bSBarry Smith                                         MatView_SeqDense,
2155357abbc8SBarry Smith                                         0,
215697304618SKris Buschelman                                         0,
2157d519adbfSMatthew Knepley                                 /* 64*/ 0,
215897304618SKris Buschelman                                         0,
215997304618SKris Buschelman                                         0,
216097304618SKris Buschelman                                         0,
216197304618SKris Buschelman                                         0,
2162d519adbfSMatthew Knepley                                 /* 69*/ MatGetRowMaxAbs_SeqDense,
216397304618SKris Buschelman                                         0,
216497304618SKris Buschelman                                         0,
216597304618SKris Buschelman                                         0,
216697304618SKris Buschelman                                         0,
2167d519adbfSMatthew Knepley                                 /* 74*/ 0,
216897304618SKris Buschelman                                         0,
216997304618SKris Buschelman                                         0,
217097304618SKris Buschelman                                         0,
217197304618SKris Buschelman                                         0,
2172d519adbfSMatthew Knepley                                 /* 79*/ 0,
217397304618SKris Buschelman                                         0,
217497304618SKris Buschelman                                         0,
217597304618SKris Buschelman                                         0,
21765bba2384SShri Abhyankar                                 /* 83*/ MatLoad_SeqDense,
2177865e5f61SKris Buschelman                                         0,
21781cbb95d3SBarry Smith                                         MatIsHermitian_SeqDense,
2179865e5f61SKris Buschelman                                         0,
2180865e5f61SKris Buschelman                                         0,
2181865e5f61SKris Buschelman                                         0,
2182d519adbfSMatthew Knepley                                 /* 89*/ MatMatMult_SeqDense_SeqDense,
2183a9fe9ddaSSatish Balay                                         MatMatMultSymbolic_SeqDense_SeqDense,
2184a9fe9ddaSSatish Balay                                         MatMatMultNumeric_SeqDense_SeqDense,
2185*abc3b08eSStefano Zampini                                         MatPtAP_SeqDense_SeqDense,
2186*abc3b08eSStefano Zampini                                         MatPtAPSymbolic_SeqDense_SeqDense,
2187*abc3b08eSStefano Zampini                                 /* 94*/ MatPtAPNumeric_SeqDense_SeqDense,
21885df89d91SHong Zhang                                         0,
21895df89d91SHong Zhang                                         0,
21905df89d91SHong Zhang                                         0,
2191284134d9SBarry Smith                                         0,
2192d519adbfSMatthew Knepley                                 /* 99*/ 0,
2193284134d9SBarry Smith                                         0,
2194284134d9SBarry Smith                                         0,
2195ba337c44SJed Brown                                         MatConjugate_SeqDense,
2196f73d5cc4SBarry Smith                                         0,
2197ba337c44SJed Brown                                 /*104*/ 0,
2198ba337c44SJed Brown                                         MatRealPart_SeqDense,
2199ba337c44SJed Brown                                         MatImaginaryPart_SeqDense,
2200985db425SBarry Smith                                         0,
2201985db425SBarry Smith                                         0,
220285e2c93fSHong Zhang                                 /*109*/ MatMatSolve_SeqDense,
2203985db425SBarry Smith                                         0,
22048d0534beSBarry Smith                                         MatGetRowMin_SeqDense,
2205aabbc4fbSShri Abhyankar                                         MatGetColumnVector_SeqDense,
22063b49f96aSBarry Smith                                         MatMissingDiagonal_SeqDense,
2207aabbc4fbSShri Abhyankar                                 /*114*/ 0,
2208aabbc4fbSShri Abhyankar                                         0,
2209aabbc4fbSShri Abhyankar                                         0,
2210aabbc4fbSShri Abhyankar                                         0,
2211aabbc4fbSShri Abhyankar                                         0,
2212aabbc4fbSShri Abhyankar                                 /*119*/ 0,
2213aabbc4fbSShri Abhyankar                                         0,
2214aabbc4fbSShri Abhyankar                                         0,
22150716a85fSBarry Smith                                         0,
22160716a85fSBarry Smith                                         0,
22170716a85fSBarry Smith                                 /*124*/ 0,
22185df89d91SHong Zhang                                         MatGetColumnNorms_SeqDense,
22195df89d91SHong Zhang                                         0,
22205df89d91SHong Zhang                                         0,
22215df89d91SHong Zhang                                         0,
22225df89d91SHong Zhang                                 /*129*/ 0,
222375648e8dSHong Zhang                                         MatTransposeMatMult_SeqDense_SeqDense,
222475648e8dSHong Zhang                                         MatTransposeMatMultSymbolic_SeqDense_SeqDense,
222575648e8dSHong Zhang                                         MatTransposeMatMultNumeric_SeqDense_SeqDense,
22263964eb88SJed Brown                                         0,
22273964eb88SJed Brown                                 /*134*/ 0,
22283964eb88SJed Brown                                         0,
22293964eb88SJed Brown                                         0,
22303964eb88SJed Brown                                         0,
22313964eb88SJed Brown                                         0,
22323964eb88SJed Brown                                 /*139*/ 0,
2233f9426fe0SMark Adams                                         0,
22343964eb88SJed Brown                                         0
2235985db425SBarry Smith };
223690ace30eSBarry Smith 
22374a2ae208SSatish Balay #undef __FUNCT__
22384a2ae208SSatish Balay #define __FUNCT__ "MatCreateSeqDense"
22394b828684SBarry Smith /*@C
2240fafbff53SBarry Smith    MatCreateSeqDense - Creates a sequential dense matrix that
2241d65003e9SLois Curfman McInnes    is stored in column major order (the usual Fortran 77 manner). Many
2242d65003e9SLois Curfman McInnes    of the matrix operations use the BLAS and LAPACK routines.
2243289bc588SBarry Smith 
2244db81eaa0SLois Curfman McInnes    Collective on MPI_Comm
2245db81eaa0SLois Curfman McInnes 
224620563c6bSBarry Smith    Input Parameters:
2247db81eaa0SLois Curfman McInnes +  comm - MPI communicator, set to PETSC_COMM_SELF
22480c775827SLois Curfman McInnes .  m - number of rows
224918f449edSLois Curfman McInnes .  n - number of columns
22500298fd71SBarry Smith -  data - optional location of matrix data in column major order.  Set data=NULL for PETSc
2251dfc5480cSLois Curfman McInnes    to control all matrix memory allocation.
225220563c6bSBarry Smith 
225320563c6bSBarry Smith    Output Parameter:
225444cd7ae7SLois Curfman McInnes .  A - the matrix
225520563c6bSBarry Smith 
2256b259b22eSLois Curfman McInnes    Notes:
225718f449edSLois Curfman McInnes    The data input variable is intended primarily for Fortran programmers
225818f449edSLois Curfman McInnes    who wish to allocate their own matrix memory space.  Most users should
22590298fd71SBarry Smith    set data=NULL.
226018f449edSLois Curfman McInnes 
2261027ccd11SLois Curfman McInnes    Level: intermediate
2262027ccd11SLois Curfman McInnes 
2263dbd7a890SLois Curfman McInnes .keywords: dense, matrix, LAPACK, BLAS
2264d65003e9SLois Curfman McInnes 
226569b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues()
226620563c6bSBarry Smith @*/
22677087cfbeSBarry Smith PetscErrorCode  MatCreateSeqDense(MPI_Comm comm,PetscInt m,PetscInt n,PetscScalar *data,Mat *A)
2268289bc588SBarry Smith {
2269dfbe8321SBarry Smith   PetscErrorCode ierr;
22703b2fbd54SBarry Smith 
22713a40ed3dSBarry Smith   PetscFunctionBegin;
2272f69a0ea3SMatthew Knepley   ierr = MatCreate(comm,A);CHKERRQ(ierr);
2273f69a0ea3SMatthew Knepley   ierr = MatSetSizes(*A,m,n,m,n);CHKERRQ(ierr);
2274273d9f13SBarry Smith   ierr = MatSetType(*A,MATSEQDENSE);CHKERRQ(ierr);
2275273d9f13SBarry Smith   ierr = MatSeqDenseSetPreallocation(*A,data);CHKERRQ(ierr);
2276273d9f13SBarry Smith   PetscFunctionReturn(0);
2277273d9f13SBarry Smith }
2278273d9f13SBarry Smith 
22794a2ae208SSatish Balay #undef __FUNCT__
2280afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation"
2281273d9f13SBarry Smith /*@C
2282273d9f13SBarry Smith    MatSeqDenseSetPreallocation - Sets the array used for storing the matrix elements
2283273d9f13SBarry Smith 
2284273d9f13SBarry Smith    Collective on MPI_Comm
2285273d9f13SBarry Smith 
2286273d9f13SBarry Smith    Input Parameters:
22871c4f3114SJed Brown +  B - the matrix
22880298fd71SBarry Smith -  data - the array (or NULL)
2289273d9f13SBarry Smith 
2290273d9f13SBarry Smith    Notes:
2291273d9f13SBarry Smith    The data input variable is intended primarily for Fortran programmers
2292273d9f13SBarry Smith    who wish to allocate their own matrix memory space.  Most users should
2293284134d9SBarry Smith    need not call this routine.
2294273d9f13SBarry Smith 
2295273d9f13SBarry Smith    Level: intermediate
2296273d9f13SBarry Smith 
2297273d9f13SBarry Smith .keywords: dense, matrix, LAPACK, BLAS
2298273d9f13SBarry Smith 
229969b1f4b7SBarry Smith .seealso: MatCreate(), MatCreateDense(), MatSetValues(), MatSeqDenseSetLDA()
2300867c911aSBarry Smith 
2301273d9f13SBarry Smith @*/
23027087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation(Mat B,PetscScalar data[])
2303273d9f13SBarry Smith {
23044ac538c5SBarry Smith   PetscErrorCode ierr;
2305a23d5eceSKris Buschelman 
2306a23d5eceSKris Buschelman   PetscFunctionBegin;
23074ac538c5SBarry Smith   ierr = PetscTryMethod(B,"MatSeqDenseSetPreallocation_C",(Mat,PetscScalar[]),(B,data));CHKERRQ(ierr);
2308a23d5eceSKris Buschelman   PetscFunctionReturn(0);
2309a23d5eceSKris Buschelman }
2310a23d5eceSKris Buschelman 
2311a23d5eceSKris Buschelman #undef __FUNCT__
2312afc30d2aSLisandro Dalcin #define __FUNCT__ "MatSeqDenseSetPreallocation_SeqDense"
23137087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetPreallocation_SeqDense(Mat B,PetscScalar *data)
2314a23d5eceSKris Buschelman {
2315273d9f13SBarry Smith   Mat_SeqDense   *b;
2316dfbe8321SBarry Smith   PetscErrorCode ierr;
2317273d9f13SBarry Smith 
2318273d9f13SBarry Smith   PetscFunctionBegin;
2319273d9f13SBarry Smith   B->preallocated = PETSC_TRUE;
2320a868139aSShri Abhyankar 
232134ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->rmap);CHKERRQ(ierr);
232234ef9618SShri Abhyankar   ierr = PetscLayoutSetUp(B->cmap);CHKERRQ(ierr);
232334ef9618SShri Abhyankar 
2324273d9f13SBarry Smith   b       = (Mat_SeqDense*)B->data;
232586d161a7SShri Abhyankar   b->Mmax = B->rmap->n;
232686d161a7SShri Abhyankar   b->Nmax = B->cmap->n;
232786d161a7SShri Abhyankar   if (b->lda <= 0 || b->changelda) b->lda = B->rmap->n;
232886d161a7SShri Abhyankar 
23299e8f95c4SLisandro Dalcin   if (!data) { /* petsc-allocated storage */
23309e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2331e92229d0SSatish Balay     ierr = PetscCalloc1((size_t)b->lda*b->Nmax,&b->v);CHKERRQ(ierr);
23323bb1ff40SBarry Smith     ierr = PetscLogObjectMemory((PetscObject)B,b->lda*b->Nmax*sizeof(PetscScalar));CHKERRQ(ierr);
23332205254eSKarl Rupp 
23349e8f95c4SLisandro Dalcin     b->user_alloc = PETSC_FALSE;
2335273d9f13SBarry Smith   } else { /* user-allocated storage */
23369e8f95c4SLisandro Dalcin     if (!b->user_alloc) { ierr = PetscFree(b->v);CHKERRQ(ierr); }
2337273d9f13SBarry Smith     b->v          = data;
2338273d9f13SBarry Smith     b->user_alloc = PETSC_TRUE;
2339273d9f13SBarry Smith   }
23400450473dSBarry Smith   B->assembled = PETSC_TRUE;
2341273d9f13SBarry Smith   PetscFunctionReturn(0);
2342273d9f13SBarry Smith }
2343273d9f13SBarry Smith 
234465b80a83SHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
23451b807ce4Svictorle #undef __FUNCT__
23468baccfbdSHong Zhang #define __FUNCT__ "MatConvert_SeqDense_Elemental"
23478baccfbdSHong Zhang PETSC_EXTERN PetscErrorCode MatConvert_SeqDense_Elemental(Mat A, MatType newtype,MatReuse reuse,Mat *newmat)
23488baccfbdSHong Zhang {
2349d77f618aSHong Zhang   Mat            mat_elemental;
2350d77f618aSHong Zhang   PetscErrorCode ierr;
2351d77f618aSHong Zhang   PetscScalar    *array,*v_colwise;
2352d77f618aSHong Zhang   PetscInt       M=A->rmap->N,N=A->cmap->N,i,j,k,*rows,*cols;
2353d77f618aSHong Zhang 
23548baccfbdSHong Zhang   PetscFunctionBegin;
2355d77f618aSHong Zhang   ierr = PetscMalloc3(M*N,&v_colwise,M,&rows,N,&cols);CHKERRQ(ierr);
2356d77f618aSHong Zhang   ierr = MatDenseGetArray(A,&array);CHKERRQ(ierr);
2357d77f618aSHong Zhang   /* convert column-wise array into row-wise v_colwise, see MatSetValues_Elemental() */
2358d77f618aSHong Zhang   k = 0;
2359d77f618aSHong Zhang   for (j=0; j<N; j++) {
2360d77f618aSHong Zhang     cols[j] = j;
2361d77f618aSHong Zhang     for (i=0; i<M; i++) {
2362d77f618aSHong Zhang       v_colwise[j*M+i] = array[k++];
2363d77f618aSHong Zhang     }
2364d77f618aSHong Zhang   }
2365d77f618aSHong Zhang   for (i=0; i<M; i++) {
2366d77f618aSHong Zhang     rows[i] = i;
2367d77f618aSHong Zhang   }
2368d77f618aSHong Zhang   ierr = MatDenseRestoreArray(A,&array);CHKERRQ(ierr);
2369d77f618aSHong Zhang 
2370d77f618aSHong Zhang   ierr = MatCreate(PetscObjectComm((PetscObject)A), &mat_elemental);CHKERRQ(ierr);
2371d77f618aSHong Zhang   ierr = MatSetSizes(mat_elemental,PETSC_DECIDE,PETSC_DECIDE,M,N);CHKERRQ(ierr);
2372d77f618aSHong Zhang   ierr = MatSetType(mat_elemental,MATELEMENTAL);CHKERRQ(ierr);
2373d77f618aSHong Zhang   ierr = MatSetUp(mat_elemental);CHKERRQ(ierr);
2374d77f618aSHong Zhang 
2375d77f618aSHong Zhang   /* PETSc-Elemental interaface uses axpy for setting off-processor entries, only ADD_VALUES is allowed */
2376d77f618aSHong Zhang   ierr = MatSetValues(mat_elemental,M,rows,N,cols,v_colwise,ADD_VALUES);CHKERRQ(ierr);
2377d77f618aSHong Zhang   ierr = MatAssemblyBegin(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2378d77f618aSHong Zhang   ierr = MatAssemblyEnd(mat_elemental, MAT_FINAL_ASSEMBLY);CHKERRQ(ierr);
2379d77f618aSHong Zhang   ierr = PetscFree3(v_colwise,rows,cols);CHKERRQ(ierr);
2380d77f618aSHong Zhang 
2381511c6705SHong Zhang   if (reuse == MAT_INPLACE_MATRIX) {
238228be2f97SBarry Smith     ierr = MatHeaderReplace(A,&mat_elemental);CHKERRQ(ierr);
2383d77f618aSHong Zhang   } else {
2384d77f618aSHong Zhang     *newmat = mat_elemental;
2385d77f618aSHong Zhang   }
23868baccfbdSHong Zhang   PetscFunctionReturn(0);
23878baccfbdSHong Zhang }
238865b80a83SHong Zhang #endif
23898baccfbdSHong Zhang 
23908baccfbdSHong Zhang #undef __FUNCT__
23911b807ce4Svictorle #define __FUNCT__ "MatSeqDenseSetLDA"
23921b807ce4Svictorle /*@C
23931b807ce4Svictorle   MatSeqDenseSetLDA - Declare the leading dimension of the user-provided array
23941b807ce4Svictorle 
23951b807ce4Svictorle   Input parameter:
23961b807ce4Svictorle + A - the matrix
23971b807ce4Svictorle - lda - the leading dimension
23981b807ce4Svictorle 
23991b807ce4Svictorle   Notes:
2400867c911aSBarry Smith   This routine is to be used in conjunction with MatSeqDenseSetPreallocation();
24011b807ce4Svictorle   it asserts that the preallocation has a leading dimension (the LDA parameter
24021b807ce4Svictorle   of Blas and Lapack fame) larger than M, the first dimension of the matrix.
24031b807ce4Svictorle 
24041b807ce4Svictorle   Level: intermediate
24051b807ce4Svictorle 
24061b807ce4Svictorle .keywords: dense, matrix, LAPACK, BLAS
24071b807ce4Svictorle 
2408284134d9SBarry Smith .seealso: MatCreate(), MatCreateSeqDense(), MatSeqDenseSetPreallocation(), MatSetMaximumSize()
2409867c911aSBarry Smith 
24101b807ce4Svictorle @*/
24117087cfbeSBarry Smith PetscErrorCode  MatSeqDenseSetLDA(Mat B,PetscInt lda)
24121b807ce4Svictorle {
24131b807ce4Svictorle   Mat_SeqDense *b = (Mat_SeqDense*)B->data;
241421a2c019SBarry Smith 
24151b807ce4Svictorle   PetscFunctionBegin;
2416e32f2f54SBarry 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);
24171b807ce4Svictorle   b->lda       = lda;
241821a2c019SBarry Smith   b->changelda = PETSC_FALSE;
241921a2c019SBarry Smith   b->Mmax      = PetscMax(b->Mmax,lda);
24201b807ce4Svictorle   PetscFunctionReturn(0);
24211b807ce4Svictorle }
24221b807ce4Svictorle 
24230bad9183SKris Buschelman /*MC
2424fafad747SKris Buschelman    MATSEQDENSE - MATSEQDENSE = "seqdense" - A matrix type to be used for sequential dense matrices.
24250bad9183SKris Buschelman 
24260bad9183SKris Buschelman    Options Database Keys:
24270bad9183SKris Buschelman . -mat_type seqdense - sets the matrix type to "seqdense" during a call to MatSetFromOptions()
24280bad9183SKris Buschelman 
24290bad9183SKris Buschelman   Level: beginner
24300bad9183SKris Buschelman 
243189665df3SBarry Smith .seealso: MatCreateSeqDense()
243289665df3SBarry Smith 
24330bad9183SKris Buschelman M*/
24340bad9183SKris Buschelman 
24354a2ae208SSatish Balay #undef __FUNCT__
24364a2ae208SSatish Balay #define __FUNCT__ "MatCreate_SeqDense"
24378cc058d9SJed Brown PETSC_EXTERN PetscErrorCode MatCreate_SeqDense(Mat B)
2438273d9f13SBarry Smith {
2439273d9f13SBarry Smith   Mat_SeqDense   *b;
2440dfbe8321SBarry Smith   PetscErrorCode ierr;
24417c334f02SBarry Smith   PetscMPIInt    size;
2442273d9f13SBarry Smith 
2443273d9f13SBarry Smith   PetscFunctionBegin;
2444ce94432eSBarry Smith   ierr = MPI_Comm_size(PetscObjectComm((PetscObject)B),&size);CHKERRQ(ierr);
2445e32f2f54SBarry Smith   if (size > 1) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_WRONG,"Comm must be of size 1");
244655659b69SBarry Smith 
2447b00a9115SJed Brown   ierr    = PetscNewLog(B,&b);CHKERRQ(ierr);
2448549d3d68SSatish Balay   ierr    = PetscMemcpy(B->ops,&MatOps_Values,sizeof(struct _MatOps));CHKERRQ(ierr);
244944cd7ae7SLois Curfman McInnes   B->data = (void*)b;
245018f449edSLois Curfman McInnes 
245144cd7ae7SLois Curfman McInnes   b->pivots      = 0;
2452273d9f13SBarry Smith   b->roworiented = PETSC_TRUE;
2453273d9f13SBarry Smith   b->v           = 0;
245421a2c019SBarry Smith   b->changelda   = PETSC_FALSE;
24554e220ebcSLois Curfman McInnes 
2456bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseGetArray_C",MatDenseGetArray_SeqDense);CHKERRQ(ierr);
2457bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatDenseRestoreArray_C",MatDenseRestoreArray_SeqDense);CHKERRQ(ierr);
2458bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_seqaij_C",MatConvert_SeqDense_SeqAIJ);CHKERRQ(ierr);
24598baccfbdSHong Zhang #if defined(PETSC_HAVE_ELEMENTAL)
24608baccfbdSHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatConvert_seqdense_elemental_C",MatConvert_SeqDense_Elemental);CHKERRQ(ierr);
24618baccfbdSHong Zhang #endif
2462bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatSeqDenseSetPreallocation_C",MatSeqDenseSetPreallocation_SeqDense);CHKERRQ(ierr);
2463bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMult_seqaij_seqdense_C",MatMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
2464bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultSymbolic_seqaij_seqdense_C",MatMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
2465bdf89e91SBarry Smith   ierr = PetscObjectComposeFunction((PetscObject)B,"MatMatMultNumeric_seqaij_seqdense_C",MatMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
2466*abc3b08eSStefano Zampini   ierr = PetscObjectComposeFunction((PetscObject)B,"MatPtAP_seqaij_seqdense_C",MatPtAP_SeqDense_SeqDense);CHKERRQ(ierr);
24673bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMult_seqaij_seqdense_C",MatTransposeMatMult_SeqAIJ_SeqDense);CHKERRQ(ierr);
24683bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultSymbolic_seqaij_seqdense_C",MatTransposeMatMultSymbolic_SeqAIJ_SeqDense);CHKERRQ(ierr);
24693bf78175SHong Zhang   ierr = PetscObjectComposeFunction((PetscObject)B,"MatTransposeMatMultNumeric_seqaij_seqdense_C",MatTransposeMatMultNumeric_SeqAIJ_SeqDense);CHKERRQ(ierr);
247017667f90SBarry Smith   ierr = PetscObjectChangeTypeName((PetscObject)B,MATSEQDENSE);CHKERRQ(ierr);
24713a40ed3dSBarry Smith   PetscFunctionReturn(0);
2472289bc588SBarry Smith }
2473