xref: /petsc/src/mat/tests/ex125.c (revision 28b400f66ebc7ae0049166a2294dfcd3df27e64b)
1c4762a1bSJed Brown static char help[] = "Tests MatSolve() and MatMatSolve() (interface to superlu_dist, mumps and mkl_pardiso).\n\
2c4762a1bSJed Brown Example: mpiexec -n <np> ./ex125 -f <matrix binary file> -nrhs 4 \n\n";
3c4762a1bSJed Brown 
4c4762a1bSJed Brown #include <petscmat.h>
5c4762a1bSJed Brown 
6c4762a1bSJed Brown int main(int argc,char **args)
7c4762a1bSJed Brown {
8c4762a1bSJed Brown   Mat            A,RHS,C,F,X;
9c4762a1bSJed Brown   Vec            u,x,b;
10c4762a1bSJed Brown   PetscErrorCode ierr;
11c4762a1bSJed Brown   PetscMPIInt    size;
12c4762a1bSJed Brown   PetscInt       m,n,nfact,nsolve,nrhs,ipack=0;
13c4762a1bSJed Brown   PetscReal      norm,tol=1.e-10;
14c4762a1bSJed Brown   IS             perm,iperm;
15c4762a1bSJed Brown   MatFactorInfo  info;
16c4762a1bSJed Brown   PetscRandom    rand;
17c4762a1bSJed Brown   PetscBool      flg,testMatSolve=PETSC_TRUE,testMatMatSolve=PETSC_TRUE;
18c4762a1bSJed Brown   PetscBool      chol=PETSC_FALSE,view=PETSC_FALSE,matsolvexx = PETSC_FALSE;
19c4762a1bSJed Brown #if defined(PETSC_HAVE_MUMPS)
20c4762a1bSJed Brown   PetscBool      test_mumps_opts=PETSC_FALSE;
21c4762a1bSJed Brown #endif
22c4762a1bSJed Brown   PetscViewer    fd;              /* viewer */
23c4762a1bSJed Brown   char           file[PETSC_MAX_PATH_LEN]; /* input file name */
24c4762a1bSJed Brown 
25c4762a1bSJed Brown   ierr = PetscInitialize(&argc,&args,(char*)0,help);if (ierr) return ierr;
265f80ce2aSJacob Faibussowitsch   CHKERRMPI(MPI_Comm_size(PETSC_COMM_WORLD, &size));
27c4762a1bSJed Brown 
28c4762a1bSJed Brown   /* Determine file from which we read the matrix A */
295f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetString(NULL,NULL,"-f",file,sizeof(file),&flg));
309a14fc28SStefano Zampini   if (flg) { /* Load matrix A */
315f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerBinaryOpen(PETSC_COMM_WORLD,file,FILE_MODE_READ,&fd));
325f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreate(PETSC_COMM_WORLD,&A));
335f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetFromOptions(A));
345f80ce2aSJacob Faibussowitsch     CHKERRQ(MatLoad(A,fd));
355f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscViewerDestroy(&fd));
369a14fc28SStefano Zampini   } else {
379a14fc28SStefano Zampini     n = 13;
385f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL));
395f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCreate(PETSC_COMM_WORLD,&A));
405f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetType(A,MATAIJ));
415f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetFromOptions(A));
425f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,n,n));
435f80ce2aSJacob Faibussowitsch     CHKERRQ(MatSetUp(A));
445f80ce2aSJacob Faibussowitsch     CHKERRQ(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY));
455f80ce2aSJacob Faibussowitsch     CHKERRQ(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY));
465f80ce2aSJacob Faibussowitsch     CHKERRQ(MatShift(A,1.0));
479a14fc28SStefano Zampini   }
485f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetLocalSize(A,&m,&n));
492c71b3e2SJacob Faibussowitsch   PetscCheckFalse(m != n,PETSC_COMM_SELF,PETSC_ERR_ARG_SIZ, "This example is not intended for rectangular matrices (%" PetscInt_FMT ", %" PetscInt_FMT ")", m, n);
50c4762a1bSJed Brown 
51c4762a1bSJed Brown   /* if A is symmetric, set its flag -- required by MatGetInertia() */
525f80ce2aSJacob Faibussowitsch   CHKERRQ(MatIsSymmetric(A,0.0,&flg));
53c4762a1bSJed Brown 
545f80ce2aSJacob Faibussowitsch   CHKERRQ(MatViewFromOptions(A,NULL,"-A_view"));
55c4762a1bSJed Brown 
56a5b23f4aSJose E. Roman   /* Create dense matrix C and X; C holds true solution with identical columns */
57c4762a1bSJed Brown   nrhs = 2;
585f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-nrhs",&nrhs,NULL));
595f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"ex125: nrhs %" PetscInt_FMT "\n",nrhs));
605f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreate(PETSC_COMM_WORLD,&C));
615f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetOptionsPrefix(C,"rhs_"));
625f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetSizes(C,m,PETSC_DECIDE,PETSC_DECIDE,nrhs));
635f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetType(C,MATDENSE));
645f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetFromOptions(C));
655f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetUp(C));
66c4762a1bSJed Brown 
675f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-view_factor",&view,NULL));
685f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-test_matmatsolve",&testMatMatSolve,NULL));
695f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-cholesky",&chol,NULL));
70c4762a1bSJed Brown #if defined(PETSC_HAVE_MUMPS)
715f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetBool(NULL,NULL,"-test_mumps_opts",&test_mumps_opts,NULL));
72c4762a1bSJed Brown #endif
73c4762a1bSJed Brown 
745f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscRandomCreate(PETSC_COMM_WORLD,&rand));
755f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscRandomSetFromOptions(rand));
765f80ce2aSJacob Faibussowitsch   CHKERRQ(MatSetRandom(C,rand));
775f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDuplicate(C,MAT_DO_NOT_COPY_VALUES,&X));
78c4762a1bSJed Brown 
79c4762a1bSJed Brown   /* Create vectors */
805f80ce2aSJacob Faibussowitsch   CHKERRQ(MatCreateVecs(A,&x,&b));
815f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDuplicate(x,&u)); /* save the true solution */
82c4762a1bSJed Brown 
83c4762a1bSJed Brown   /* Test Factorization */
845f80ce2aSJacob Faibussowitsch   CHKERRQ(MatGetOrdering(A,MATORDERINGND,&perm,&iperm));
85c4762a1bSJed Brown 
865f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscOptionsGetInt(NULL,NULL,"-mat_solver_type",&ipack,NULL));
87c4762a1bSJed Brown   switch (ipack) {
88c4762a1bSJed Brown #if defined(PETSC_HAVE_SUPERLU)
89c4762a1bSJed Brown   case 0:
90*28b400f6SJacob Faibussowitsch     PetscCheck(!chol,PETSC_COMM_WORLD,PETSC_ERR_SUP,"SuperLU does not provide Cholesky!");
915f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," SUPERLU LU:\n"));
925f80ce2aSJacob Faibussowitsch     CHKERRQ(MatGetFactor(A,MATSOLVERSUPERLU,MAT_FACTOR_LU,&F));
93c4762a1bSJed Brown     matsolvexx = PETSC_TRUE;
94c4762a1bSJed Brown     break;
95c4762a1bSJed Brown #endif
96c4762a1bSJed Brown #if defined(PETSC_HAVE_SUPERLU_DIST)
97c4762a1bSJed Brown   case 1:
98*28b400f6SJacob Faibussowitsch     PetscCheck(!chol,PETSC_COMM_WORLD,PETSC_ERR_SUP,"SuperLU does not provide Cholesky!");
995f80ce2aSJacob Faibussowitsch     CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," SUPERLU_DIST LU:\n"));
1005f80ce2aSJacob Faibussowitsch     CHKERRQ(MatGetFactor(A,MATSOLVERSUPERLU_DIST,MAT_FACTOR_LU,&F));
101c4762a1bSJed Brown     matsolvexx = PETSC_TRUE;
102c4762a1bSJed Brown     break;
103c4762a1bSJed Brown #endif
104c4762a1bSJed Brown #if defined(PETSC_HAVE_MUMPS)
105c4762a1bSJed Brown   case 2:
106c4762a1bSJed Brown     if (chol) {
1075f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," MUMPS CHOLESKY:\n"));
1085f80ce2aSJacob Faibussowitsch       CHKERRQ(MatGetFactor(A,MATSOLVERMUMPS,MAT_FACTOR_CHOLESKY,&F));
109c4762a1bSJed Brown     } else {
1105f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," MUMPS LU:\n"));
1115f80ce2aSJacob Faibussowitsch       CHKERRQ(MatGetFactor(A,MATSOLVERMUMPS,MAT_FACTOR_LU,&F));
112c4762a1bSJed Brown     }
113c4762a1bSJed Brown     matsolvexx = PETSC_TRUE;
114c4762a1bSJed Brown     if (test_mumps_opts) {
115c4762a1bSJed Brown       /* test mumps options */
116c4762a1bSJed Brown       PetscInt  icntl;
117c4762a1bSJed Brown       PetscReal cntl;
118c4762a1bSJed Brown 
119c4762a1bSJed Brown       icntl = 2;        /* sequential matrix ordering */
1205f80ce2aSJacob Faibussowitsch       CHKERRQ(MatMumpsSetIcntl(F,7,icntl));
121c4762a1bSJed Brown 
122c4762a1bSJed Brown       cntl = 1.e-6; /* threshold for row pivot detection */
1235f80ce2aSJacob Faibussowitsch       CHKERRQ(MatMumpsSetIcntl(F,24,1));
1245f80ce2aSJacob Faibussowitsch       CHKERRQ(MatMumpsSetCntl(F,3,cntl));
125c4762a1bSJed Brown     }
126c4762a1bSJed Brown     break;
127c4762a1bSJed Brown #endif
128c4762a1bSJed Brown #if defined(PETSC_HAVE_MKL_PARDISO)
129c4762a1bSJed Brown   case 3:
130c4762a1bSJed Brown     if (chol) {
1315f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," MKL_PARDISO CHOLESKY:\n"));
1325f80ce2aSJacob Faibussowitsch       CHKERRQ(MatGetFactor(A,MATSOLVERMKL_PARDISO,MAT_FACTOR_CHOLESKY,&F));
133c4762a1bSJed Brown     } else {
1345f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," MKL_PARDISO LU:\n"));
1355f80ce2aSJacob Faibussowitsch       CHKERRQ(MatGetFactor(A,MATSOLVERMKL_PARDISO,MAT_FACTOR_LU,&F));
136c4762a1bSJed Brown     }
137c4762a1bSJed Brown     break;
138c4762a1bSJed Brown #endif
13938a8e8c1SStefano Zampini #if defined(PETSC_HAVE_CUDA)
14038a8e8c1SStefano Zampini   case 4:
14138a8e8c1SStefano Zampini     if (chol) {
1425f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," CUSPARSE CHOLESKY:\n"));
1435f80ce2aSJacob Faibussowitsch       CHKERRQ(MatGetFactor(A,MATSOLVERCUSPARSE,MAT_FACTOR_CHOLESKY,&F));
14438a8e8c1SStefano Zampini     } else {
1455f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," CUSPARSE LU:\n"));
1465f80ce2aSJacob Faibussowitsch       CHKERRQ(MatGetFactor(A,MATSOLVERCUSPARSE,MAT_FACTOR_LU,&F));
14738a8e8c1SStefano Zampini     }
14838a8e8c1SStefano Zampini     break;
14938a8e8c1SStefano Zampini #endif
150c4762a1bSJed Brown   default:
151c4762a1bSJed Brown     if (chol) {
1525f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," PETSC CHOLESKY:\n"));
1535f80ce2aSJacob Faibussowitsch       CHKERRQ(MatGetFactor(A,MATSOLVERPETSC,MAT_FACTOR_CHOLESKY,&F));
154c4762a1bSJed Brown     } else {
1555f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," PETSC LU:\n"));
1565f80ce2aSJacob Faibussowitsch       CHKERRQ(MatGetFactor(A,MATSOLVERPETSC,MAT_FACTOR_LU,&F));
157c4762a1bSJed Brown     }
158c4762a1bSJed Brown     matsolvexx = PETSC_TRUE;
159c4762a1bSJed Brown   }
160c4762a1bSJed Brown 
1615f80ce2aSJacob Faibussowitsch   CHKERRQ(MatFactorInfoInitialize(&info));
162c4762a1bSJed Brown   info.fill      = 5.0;
163c4762a1bSJed Brown   info.shifttype = (PetscReal) MAT_SHIFT_NONE;
164c4762a1bSJed Brown   if (chol) {
1655f80ce2aSJacob Faibussowitsch     CHKERRQ(MatCholeskyFactorSymbolic(F,A,perm,&info));
166c4762a1bSJed Brown   } else {
1675f80ce2aSJacob Faibussowitsch     CHKERRQ(MatLUFactorSymbolic(F,A,perm,iperm,&info));
168c4762a1bSJed Brown   }
169c4762a1bSJed Brown 
170c4762a1bSJed Brown   for (nfact = 0; nfact < 2; nfact++) {
171c4762a1bSJed Brown     if (chol) {
1725f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," %" PetscInt_FMT "-the CHOLESKY numfactorization \n",nfact));
1735f80ce2aSJacob Faibussowitsch       CHKERRQ(MatCholeskyFactorNumeric(F,A,&info));
174c4762a1bSJed Brown     } else {
1755f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscPrintf(PETSC_COMM_WORLD," %" PetscInt_FMT "-the LU numfactorization \n",nfact));
1765f80ce2aSJacob Faibussowitsch       CHKERRQ(MatLUFactorNumeric(F,A,&info));
177c4762a1bSJed Brown     }
178c4762a1bSJed Brown     if (view) {
1795f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerPushFormat(PETSC_VIEWER_STDOUT_WORLD,PETSC_VIEWER_ASCII_INFO));
1805f80ce2aSJacob Faibussowitsch       CHKERRQ(MatView(F,PETSC_VIEWER_STDOUT_WORLD));
1815f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerPopFormat(PETSC_VIEWER_STDOUT_WORLD));
182c4762a1bSJed Brown       view = PETSC_FALSE;
183c4762a1bSJed Brown     }
184c4762a1bSJed Brown 
185c4762a1bSJed Brown #if defined(PETSC_HAVE_SUPERLU_DIST)
186c4762a1bSJed Brown     if (ipack == 1) { /* Test MatSuperluDistGetDiagU()
187c4762a1bSJed Brown        -- input: matrix factor F; output: main diagonal of matrix U on all processes */
188c4762a1bSJed Brown       PetscInt    M;
189c4762a1bSJed Brown       PetscScalar *diag;
190c4762a1bSJed Brown #if !defined(PETSC_USE_COMPLEX)
191c4762a1bSJed Brown       PetscInt nneg,nzero,npos;
192c4762a1bSJed Brown #endif
193c4762a1bSJed Brown 
1945f80ce2aSJacob Faibussowitsch       CHKERRQ(MatGetSize(F,&M,NULL));
1955f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscMalloc1(M,&diag));
1965f80ce2aSJacob Faibussowitsch       CHKERRQ(MatSuperluDistGetDiagU(F,diag));
1975f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscFree(diag));
198c4762a1bSJed Brown 
199c4762a1bSJed Brown #if !defined(PETSC_USE_COMPLEX)
200c4762a1bSJed Brown       /* Test MatGetInertia() */
2015f80ce2aSJacob Faibussowitsch       CHKERRQ(MatGetInertia(F,&nneg,&nzero,&npos));
2025f80ce2aSJacob Faibussowitsch       CHKERRQ(PetscViewerASCIIPrintf(PETSC_VIEWER_STDOUT_WORLD," MatInertia: nneg: %" PetscInt_FMT ", nzero: %" PetscInt_FMT ", npos: %" PetscInt_FMT "\n",nneg,nzero,npos));
203c4762a1bSJed Brown #endif
204c4762a1bSJed Brown     }
205c4762a1bSJed Brown #endif
206c4762a1bSJed Brown 
207d47f36abSHong Zhang #if defined(PETSC_HAVE_MUMPS)
208d47f36abSHong Zhang     /* mumps interface allows repeated call of MatCholeskyFactorSymbolic(), while the succession calls do nothing */
209d47f36abSHong Zhang     if (ipack == 2) {
210d47f36abSHong Zhang       if (chol) {
2115f80ce2aSJacob Faibussowitsch         CHKERRQ(MatCholeskyFactorSymbolic(F,A,perm,&info));
2125f80ce2aSJacob Faibussowitsch         CHKERRQ(MatCholeskyFactorNumeric(F,A,&info));
213d47f36abSHong Zhang       } else {
2145f80ce2aSJacob Faibussowitsch         CHKERRQ(MatLUFactorSymbolic(F,A,perm,iperm,&info));
2155f80ce2aSJacob Faibussowitsch         CHKERRQ(MatLUFactorNumeric(F,A,&info));
216d47f36abSHong Zhang       }
217d47f36abSHong Zhang     }
218d47f36abSHong Zhang #endif
219d47f36abSHong Zhang 
220c4762a1bSJed Brown     /* Test MatMatSolve() */
221c4762a1bSJed Brown     if (testMatMatSolve) {
222c4762a1bSJed Brown       if (!nfact) {
2235f80ce2aSJacob Faibussowitsch         CHKERRQ(MatMatMult(A,C,MAT_INITIAL_MATRIX,2.0,&RHS));
224c4762a1bSJed Brown       } else {
2255f80ce2aSJacob Faibussowitsch         CHKERRQ(MatMatMult(A,C,MAT_REUSE_MATRIX,2.0,&RHS));
226c4762a1bSJed Brown       }
227c4762a1bSJed Brown       for (nsolve = 0; nsolve < 2; nsolve++) {
2285f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"   %" PetscInt_FMT "-the MatMatSolve \n",nsolve));
2295f80ce2aSJacob Faibussowitsch         CHKERRQ(MatMatSolve(F,RHS,X));
230c4762a1bSJed Brown 
231c4762a1bSJed Brown         /* Check the error */
2325f80ce2aSJacob Faibussowitsch         CHKERRQ(MatAXPY(X,-1.0,C,SAME_NONZERO_PATTERN));
2335f80ce2aSJacob Faibussowitsch         CHKERRQ(MatNorm(X,NORM_FROBENIUS,&norm));
234c4762a1bSJed Brown         if (norm > tol) {
2355f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"%" PetscInt_FMT "-the MatMatSolve: Norm of error %g, nsolve %" PetscInt_FMT "\n",nsolve,(double)norm,nsolve));
236c4762a1bSJed Brown         }
237c4762a1bSJed Brown       }
238c4762a1bSJed Brown       if (matsolvexx) {
239c4762a1bSJed Brown         /* Test MatMatSolve(F,RHS,RHS), RHS is a dense matrix */
2405f80ce2aSJacob Faibussowitsch         CHKERRQ(MatCopy(RHS,X,SAME_NONZERO_PATTERN));
2415f80ce2aSJacob Faibussowitsch         CHKERRQ(MatMatSolve(F,X,X));
242c4762a1bSJed Brown         /* Check the error */
2435f80ce2aSJacob Faibussowitsch         CHKERRQ(MatAXPY(X,-1.0,C,SAME_NONZERO_PATTERN));
2445f80ce2aSJacob Faibussowitsch         CHKERRQ(MatNorm(X,NORM_FROBENIUS,&norm));
245c4762a1bSJed Brown         if (norm > tol) {
2465f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatMatSolve(F,RHS,RHS): Norm of error %g\n",(double)norm));
247c4762a1bSJed Brown         }
248c4762a1bSJed Brown       }
249c4762a1bSJed Brown 
250c4762a1bSJed Brown       if (ipack == 2 && size == 1) {
251c4762a1bSJed Brown         Mat spRHS,spRHST,RHST;
252c4762a1bSJed Brown 
2535f80ce2aSJacob Faibussowitsch         CHKERRQ(MatTranspose(RHS,MAT_INITIAL_MATRIX,&RHST));
2545f80ce2aSJacob Faibussowitsch         CHKERRQ(MatConvert(RHST,MATAIJ,MAT_INITIAL_MATRIX,&spRHST));
2555f80ce2aSJacob Faibussowitsch         CHKERRQ(MatCreateTranspose(spRHST,&spRHS));
256c4762a1bSJed Brown         for (nsolve = 0; nsolve < 2; nsolve++) {
2575f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"   %" PetscInt_FMT "-the sparse MatMatSolve \n",nsolve));
2585f80ce2aSJacob Faibussowitsch           CHKERRQ(MatMatSolve(F,spRHS,X));
259c4762a1bSJed Brown 
260c4762a1bSJed Brown           /* Check the error */
2615f80ce2aSJacob Faibussowitsch           CHKERRQ(MatAXPY(X,-1.0,C,SAME_NONZERO_PATTERN));
2625f80ce2aSJacob Faibussowitsch           CHKERRQ(MatNorm(X,NORM_FROBENIUS,&norm));
263c4762a1bSJed Brown           if (norm > tol) {
2645f80ce2aSJacob Faibussowitsch             CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"%" PetscInt_FMT "-the sparse MatMatSolve: Norm of error %g, nsolve %" PetscInt_FMT "\n",nsolve,(double)norm,nsolve));
265c4762a1bSJed Brown           }
266c4762a1bSJed Brown         }
2675f80ce2aSJacob Faibussowitsch         CHKERRQ(MatDestroy(&spRHST));
2685f80ce2aSJacob Faibussowitsch         CHKERRQ(MatDestroy(&spRHS));
2695f80ce2aSJacob Faibussowitsch         CHKERRQ(MatDestroy(&RHST));
270c4762a1bSJed Brown       }
271c4762a1bSJed Brown     }
272c4762a1bSJed Brown 
273c4762a1bSJed Brown     /* Test MatSolve() */
274c4762a1bSJed Brown     if (testMatSolve) {
275c4762a1bSJed Brown       for (nsolve = 0; nsolve < 2; nsolve++) {
2765f80ce2aSJacob Faibussowitsch         CHKERRQ(VecSetRandom(x,rand));
2775f80ce2aSJacob Faibussowitsch         CHKERRQ(VecCopy(x,u));
2785f80ce2aSJacob Faibussowitsch         CHKERRQ(MatMult(A,x,b));
279c4762a1bSJed Brown 
2805f80ce2aSJacob Faibussowitsch         CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"   %" PetscInt_FMT "-the MatSolve \n",nsolve));
2815f80ce2aSJacob Faibussowitsch         CHKERRQ(MatSolve(F,b,x));
282c4762a1bSJed Brown 
283c4762a1bSJed Brown         /* Check the error */
2845f80ce2aSJacob Faibussowitsch         CHKERRQ(VecAXPY(u,-1.0,x));  /* u <- (-1.0)x + u */
2855f80ce2aSJacob Faibussowitsch         CHKERRQ(VecNorm(u,NORM_2,&norm));
286c4762a1bSJed Brown         if (norm > tol) {
287c4762a1bSJed Brown           PetscReal resi;
2885f80ce2aSJacob Faibussowitsch           CHKERRQ(MatMult(A,x,u)); /* u = A*x */
2895f80ce2aSJacob Faibussowitsch           CHKERRQ(VecAXPY(u,-1.0,b));  /* u <- (-1.0)b + u */
2905f80ce2aSJacob Faibussowitsch           CHKERRQ(VecNorm(u,NORM_2,&resi));
2915f80ce2aSJacob Faibussowitsch           CHKERRQ(PetscPrintf(PETSC_COMM_WORLD,"MatSolve: Norm of error %g, resi %g, numfact %" PetscInt_FMT "\n",(double)norm,(double)resi,nfact));
292c4762a1bSJed Brown         }
293c4762a1bSJed Brown       }
294c4762a1bSJed Brown     }
295c4762a1bSJed Brown   }
296c4762a1bSJed Brown 
297c4762a1bSJed Brown   /* Free data structures */
2985f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&A));
2995f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&C));
3005f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&F));
3015f80ce2aSJacob Faibussowitsch   CHKERRQ(MatDestroy(&X));
302c4762a1bSJed Brown   if (testMatMatSolve) {
3035f80ce2aSJacob Faibussowitsch     CHKERRQ(MatDestroy(&RHS));
304c4762a1bSJed Brown   }
305c4762a1bSJed Brown 
3065f80ce2aSJacob Faibussowitsch   CHKERRQ(PetscRandomDestroy(&rand));
3075f80ce2aSJacob Faibussowitsch   CHKERRQ(ISDestroy(&perm));
3085f80ce2aSJacob Faibussowitsch   CHKERRQ(ISDestroy(&iperm));
3095f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&x));
3105f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&b));
3115f80ce2aSJacob Faibussowitsch   CHKERRQ(VecDestroy(&u));
312c4762a1bSJed Brown   ierr = PetscFinalize();
313c4762a1bSJed Brown   return ierr;
314c4762a1bSJed Brown }
315c4762a1bSJed Brown 
316c4762a1bSJed Brown /*TEST
317c4762a1bSJed Brown 
318c4762a1bSJed Brown    test:
319dfd57a17SPierre Jolivet       requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
320c4762a1bSJed Brown       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type 10
321c4762a1bSJed Brown       output_file: output/ex125.out
322c4762a1bSJed Brown 
323c4762a1bSJed Brown    test:
3249a14fc28SStefano Zampini       suffix: 2
3259a14fc28SStefano Zampini       args: -mat_solver_type 10
3269a14fc28SStefano Zampini       output_file: output/ex125.out
3279a14fc28SStefano Zampini 
3289a14fc28SStefano Zampini    test:
329c4762a1bSJed Brown       suffix: mkl_pardiso
330dfd57a17SPierre Jolivet       requires: mkl_pardiso datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
331c4762a1bSJed Brown       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type 3
332c4762a1bSJed Brown 
333c4762a1bSJed Brown    test:
3349a14fc28SStefano Zampini       suffix: mkl_pardiso_2
3359a14fc28SStefano Zampini       requires: mkl_pardiso
3369a14fc28SStefano Zampini       args: -mat_solver_type 3
3379a14fc28SStefano Zampini       output_file: output/ex125_mkl_pardiso.out
3389a14fc28SStefano Zampini 
3399a14fc28SStefano Zampini    test:
340c4762a1bSJed Brown       suffix: mumps
341dfd57a17SPierre Jolivet       requires: mumps datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
342c4762a1bSJed Brown       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type 2
343c4762a1bSJed Brown       output_file: output/ex125_mumps_seq.out
344c4762a1bSJed Brown 
345c4762a1bSJed Brown    test:
346c4762a1bSJed Brown       suffix: mumps_2
347c4762a1bSJed Brown       nsize: 3
348dfd57a17SPierre Jolivet       requires: mumps datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
349c4762a1bSJed Brown       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type 2
350c4762a1bSJed Brown       output_file: output/ex125_mumps_par.out
351c4762a1bSJed Brown 
352c4762a1bSJed Brown    test:
3539a14fc28SStefano Zampini       suffix: mumps_3
3549a14fc28SStefano Zampini       requires: mumps
3559a14fc28SStefano Zampini       args: -mat_solver_type 2
3569a14fc28SStefano Zampini       output_file: output/ex125_mumps_seq.out
3579a14fc28SStefano Zampini 
3589a14fc28SStefano Zampini    test:
3599a14fc28SStefano Zampini       suffix: mumps_4
3609a14fc28SStefano Zampini       nsize: 3
3619a14fc28SStefano Zampini       requires: mumps
3629a14fc28SStefano Zampini       args: -mat_solver_type 2
3639a14fc28SStefano Zampini       output_file: output/ex125_mumps_par.out
3649a14fc28SStefano Zampini 
3659a14fc28SStefano Zampini    test:
366d47f36abSHong Zhang       suffix: mumps_5
367d47f36abSHong Zhang       nsize: 3
368d47f36abSHong Zhang       requires: mumps
369d47f36abSHong Zhang       args: -mat_solver_type 2 -cholesky
370d47f36abSHong Zhang       output_file: output/ex125_mumps_par_cholesky.out
371d47f36abSHong Zhang 
372d47f36abSHong Zhang    test:
373c4762a1bSJed Brown       suffix: superlu_dist
3749a14fc28SStefano Zampini       nsize: {{1 3}}
375dfd57a17SPierre Jolivet       requires: datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES) superlu_dist
376c4762a1bSJed Brown       args: -f ${DATAFILESPATH}/matrices/small -mat_solver_type 1 -mat_superlu_dist_rowperm NOROWPERM
377c4762a1bSJed Brown 
378c4762a1bSJed Brown    test:
379c4762a1bSJed Brown       suffix: superlu_dist_2
3809a14fc28SStefano Zampini       nsize: {{1 3}}
3819a14fc28SStefano Zampini       requires: superlu_dist !complex
3829a14fc28SStefano Zampini       args: -n 36 -mat_solver_type 1 -mat_superlu_dist_rowperm NOROWPERM
383c4762a1bSJed Brown       output_file: output/ex125_superlu_dist.out
384c4762a1bSJed Brown 
385c4762a1bSJed Brown    test:
386c4762a1bSJed Brown       suffix: superlu_dist_complex
387c4762a1bSJed Brown       nsize: 3
388dfd57a17SPierre Jolivet       requires: datafilespath superlu_dist complex double !defined(PETSC_USE_64BIT_INDICES)
389c4762a1bSJed Brown       args: -f ${DATAFILESPATH}/matrices/farzad_B_rhs -mat_solver_type 1
390c4762a1bSJed Brown       output_file: output/ex125_superlu_dist_complex.out
391c4762a1bSJed Brown 
39238a8e8c1SStefano Zampini    test:
3939a14fc28SStefano Zampini       suffix: superlu_dist_complex_2
3949a14fc28SStefano Zampini       nsize: 3
3959a14fc28SStefano Zampini       requires: superlu_dist complex
3969a14fc28SStefano Zampini       args: -mat_solver_type 1
3979a14fc28SStefano Zampini       output_file: output/ex125_superlu_dist_complex.out
3989a14fc28SStefano Zampini 
3999a14fc28SStefano Zampini    test:
40038a8e8c1SStefano Zampini       suffix: cusparse
401dfd57a17SPierre Jolivet       requires: cuda datafilespath !complex double !defined(PETSC_USE_64BIT_INDICES)
40238a8e8c1SStefano Zampini       args: -mat_type aijcusparse -f ${DATAFILESPATH}/matrices/small -mat_solver_type 4 -cholesky {{0 1}separate output}
40338a8e8c1SStefano Zampini 
4049a14fc28SStefano Zampini    test:
4059a14fc28SStefano Zampini       suffix: cusparse_2
4069a14fc28SStefano Zampini       requires: cuda
4079a14fc28SStefano Zampini       args: -mat_type aijcusparse -mat_solver_type 4 -cholesky {{0 1}separate output}
4089a14fc28SStefano Zampini 
409c4762a1bSJed Brown TEST*/
410