source: issm/trunk-jpl/src/wrappers/matlab/io/MatlabMatrixToPetscMat.cpp@ 13749

Last change on this file since 13749 was 13749, checked in by Mathieu Morlighem, 12 years ago

CHG: moved all matlab and python code from src/c/ to src/wrappers

File size: 2.8 KB
Line 
1/* \file MatlabMatrixToPetscMatrix.cpp
2 * \brief: convert a sparse or dense matlab matrix to a serial Petsc matrix:
3 */
4
5#ifdef HAVE_CONFIG_H
6 #include <config.h>
7#else
8#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
9#endif
10#include "../../c/shared/shared.h"
11
12/*Petsc includes: */
13#include <petscmat.h>
14#include <petscvec.h>
15#include <petscksp.h>
16
17/*Matlab includes: */
18#include "./matlabio.h"
19
20PetscMat* MatlabMatrixToPetscMat(const mxArray* mxmatrix){
21
22 int dummy;
23 PetscMat* matrix=new PetscMat();
24
25 MatlabMatrixToPetscMat(&matrix->matrix, &dummy, &dummy, mxmatrix);
26
27 return matrix;
28}
29int MatlabMatrixToPetscMat(Mat* pmatrix,int* pmatrix_rows,int* pmatrix_cols,const mxArray* mxmatrix){
30
31 int rows, cols;
32 double *mxmatrix_ptr = NULL;
33 double *tmatrix = NULL;
34 int ierr;
35 int i,j;
36
37 /*output: */
38 Mat matrix = NULL;
39
40 /*matlab indices: */
41 mwIndex *ir = NULL;
42 mwIndex *jc = NULL;
43 double *pr = NULL;
44 int count;
45 int nnz;
46 int nz;
47
48 /*petsc indices: */
49 int *idxm = NULL;
50 int *idxn = NULL;
51
52 /*Ok, first check if we are dealing with a sparse or full matrix: */
53 if (mxIsSparse(mxmatrix)){
54
55 /*Dealing with sparse matrix: recover size first: */
56 mxmatrix_ptr=(double*)mxGetPr(mxmatrix);
57 rows=mxGetM(mxmatrix);
58 cols=mxGetN(mxmatrix);
59 nnz=mxGetNzmax(mxmatrix);
60 if(rows){
61 nz=(int)((double)nnz/(double)rows);
62 }
63 else{
64 nz=0;
65 }
66
67 ierr=MatCreateSeqAIJ(PETSC_COMM_SELF,rows,cols,nz,PETSC_NULL,&matrix);CHKERRQ(ierr);
68
69 /*Now, get ir,jc and pr: */
70 pr=mxGetPr(mxmatrix);
71 ir=mxGetIr(mxmatrix);
72 jc=mxGetJc(mxmatrix);
73
74 /*Now, start inserting data into sparse matrix: */
75 count=0;
76 for(i=0;i<cols;i++){
77 for(j=0;j<(jc[i+1]-jc[i]);j++){
78 MatSetValue(matrix,ir[count],i,pr[count],INSERT_VALUES);
79 count++;
80 }
81 }
82 }
83 else{
84 /*Dealing with dense matrix: recover pointer and size: */
85 mxmatrix_ptr=(double*)mxGetPr(mxmatrix);
86 rows=mxGetM(mxmatrix);
87 cols=mxGetN(mxmatrix);
88
89 /*transpose, as Petsc now does not allows MAT_COLUMN_ORIENTED matrices in MatSetValues: */
90 tmatrix=xNew<double>(rows*cols);
91 for(i=0;i<cols;i++){
92 for(j=0;j<rows;j++){
93 *(tmatrix+rows*i+j)=*(mxmatrix_ptr+cols*j+i);
94 }
95 }
96
97 /*Create serial matrix: */
98 ierr=MatCreateSeqDense(PETSC_COMM_SELF,rows,cols,NULL,&matrix);CHKERRQ(ierr);
99
100 /*Insert mxmatrix_ptr values into petsc matrix: */
101 idxm=xNew<int>(rows);
102 idxn=xNew<int>(cols);
103
104 for(i=0;i<rows;i++)idxm[i]=i;
105 for(i=0;i<cols;i++)idxn[i]=i;
106
107 ierr=MatSetValues(matrix,rows,idxm,cols,idxn,tmatrix,INSERT_VALUES); CHKERRQ(ierr);
108
109 xDelete<double>(tmatrix);
110 }
111
112 /*Assemble matrix: */
113 MatAssemblyBegin(matrix,MAT_FINAL_ASSEMBLY);
114 MatAssemblyEnd(matrix,MAT_FINAL_ASSEMBLY);
115
116 /*Assign output pointer: */
117 *pmatrix=matrix;
118 if(pmatrix_rows) *pmatrix_rows=rows;
119 if(pmatrix_cols) *pmatrix_cols=cols;
120
121 return 1;
122}
Note: See TracBrowser for help on using the repository browser.