xref: /petsc/src/mat/tests/ex134.c (revision 9a3a8673b4aea812b2f0c314666d2e7ff14d2577)
1c4762a1bSJed Brown static const char help[] = "Test parallel assembly of SBAIJ matrices\n\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscmat.h>
4c4762a1bSJed Brown 
Assemble(MPI_Comm comm,PetscInt bs,MatType mtype)5d71ae5a4SJacob Faibussowitsch PetscErrorCode Assemble(MPI_Comm comm, PetscInt bs, MatType mtype)
6d71ae5a4SJacob Faibussowitsch {
7c4762a1bSJed Brown   const PetscInt    rc[]   = {0, 1, 2, 3};
89371c9d4SSatish Balay   const PetscScalar vals[] = {100, 2,  3,  4,  5,  600, 7,  8,  9,  100, 11, 1200, 13, 14, 15, 1600, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 2800, 29, 30, 31, 32,
99371c9d4SSatish Balay                               33,  34, 35, 36, 37, 38,  39, 40, 41, 42,  43, 44,   45, 46, 47, 48,   49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 49, 60,   61, 62, 63, 64};
10c4762a1bSJed Brown   Mat               A;
11c4762a1bSJed Brown #if defined(PETSC_HAVE_MUMPS) || defined(PETSC_HAVE_MKL_CPARDISO)
12c4762a1bSJed Brown   Mat           F;
1383863137SStefano Zampini   MatSolverType stype = MATSOLVERPETSC;
14c4762a1bSJed Brown   PetscRandom   rdm;
15c4762a1bSJed Brown   Vec           b, x, y;
16c4762a1bSJed Brown   PetscInt      i, j;
17910b42cbSStefano Zampini   PetscReal     norm2, tol = 100 * PETSC_SQRT_MACHINE_EPSILON;
18c4762a1bSJed Brown   PetscBool     issbaij;
19c4762a1bSJed Brown #endif
20c4762a1bSJed Brown   PetscViewer viewer;
21c4762a1bSJed Brown 
22c4762a1bSJed Brown   PetscFunctionBegin;
239566063dSJacob Faibussowitsch   PetscCall(MatCreate(comm, &A));
249566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(A, PETSC_DECIDE, PETSC_DECIDE, 4 * bs, 4 * bs));
259566063dSJacob Faibussowitsch   PetscCall(MatSetType(A, mtype));
269566063dSJacob Faibussowitsch   PetscCall(MatMPIBAIJSetPreallocation(A, bs, 2, NULL, 2, NULL));
279566063dSJacob Faibussowitsch   PetscCall(MatMPISBAIJSetPreallocation(A, bs, 2, NULL, 2, NULL));
289566063dSJacob Faibussowitsch   PetscCall(MatSetOption(A, MAT_NEW_NONZERO_ALLOCATION_ERR, PETSC_TRUE));
29c4762a1bSJed Brown   /* All processes contribute a global matrix */
309566063dSJacob Faibussowitsch   PetscCall(MatSetValuesBlocked(A, 4, rc, 4, rc, vals, ADD_VALUES));
319566063dSJacob Faibussowitsch   PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
329566063dSJacob Faibussowitsch   PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
339566063dSJacob Faibussowitsch   PetscCall(PetscPrintf(comm, "Matrix %s(%" PetscInt_FMT ")\n", mtype, bs));
349566063dSJacob Faibussowitsch   PetscCall(PetscViewerASCIIGetStdout(comm, &viewer));
359566063dSJacob Faibussowitsch   PetscCall(PetscViewerPushFormat(viewer, PETSC_VIEWER_ASCII_INFO_DETAIL));
369566063dSJacob Faibussowitsch   PetscCall(MatView(A, viewer));
379566063dSJacob Faibussowitsch   PetscCall(PetscViewerPopFormat(viewer));
389566063dSJacob Faibussowitsch   PetscCall(MatView(A, viewer));
39c4762a1bSJed Brown #if defined(PETSC_HAVE_MUMPS) || defined(PETSC_HAVE_MKL_CPARDISO)
409566063dSJacob Faibussowitsch   PetscCall(PetscStrcmp(mtype, MATMPISBAIJ, &issbaij));
4148a46eb9SPierre Jolivet   if (!issbaij) PetscCall(MatShift(A, 10));
429566063dSJacob Faibussowitsch   PetscCall(PetscRandomCreate(PETSC_COMM_WORLD, &rdm));
439566063dSJacob Faibussowitsch   PetscCall(PetscRandomSetFromOptions(rdm));
449566063dSJacob Faibussowitsch   PetscCall(MatCreateVecs(A, &x, &y));
459566063dSJacob Faibussowitsch   PetscCall(VecDuplicate(x, &b));
46c4762a1bSJed Brown   for (j = 0; j < 2; j++) {
47c4762a1bSJed Brown   #if defined(PETSC_HAVE_MUMPS)
48c4762a1bSJed Brown     if (j == 0) stype = MATSOLVERMUMPS;
49*c13ae4d5SJunchao Zhang     if (PetscDefined(USE_REAL___FLOAT128)) tol = 1e-10;
50c4762a1bSJed Brown   #else
51c4762a1bSJed Brown     if (j == 0) continue;
52c4762a1bSJed Brown   #endif
53c4762a1bSJed Brown   #if defined(PETSC_HAVE_MKL_CPARDISO)
549131cd0dSPierre Jolivet     if (j == 1) {
559131cd0dSPierre Jolivet       if (issbaij && PetscDefined(USE_COMPLEX)) continue;
569131cd0dSPierre Jolivet       stype = MATSOLVERMKL_CPARDISO;
579131cd0dSPierre Jolivet     }
58c4762a1bSJed Brown   #else
59c4762a1bSJed Brown     if (j == 1) continue;
60c4762a1bSJed Brown   #endif
61c4762a1bSJed Brown     if (issbaij) {
629566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, stype, MAT_FACTOR_CHOLESKY, &F));
639566063dSJacob Faibussowitsch       PetscCall(MatCholeskyFactorSymbolic(F, A, NULL, NULL));
649566063dSJacob Faibussowitsch       PetscCall(MatCholeskyFactorNumeric(F, A, NULL));
65c4762a1bSJed Brown     } else {
669566063dSJacob Faibussowitsch       PetscCall(MatGetFactor(A, stype, MAT_FACTOR_LU, &F));
679566063dSJacob Faibussowitsch       PetscCall(MatLUFactorSymbolic(F, A, NULL, NULL, NULL));
689566063dSJacob Faibussowitsch       PetscCall(MatLUFactorNumeric(F, A, NULL));
69c4762a1bSJed Brown     }
70c4762a1bSJed Brown     for (i = 0; i < 10; i++) {
719566063dSJacob Faibussowitsch       PetscCall(VecSetRandom(b, rdm));
729566063dSJacob Faibussowitsch       PetscCall(MatSolve(F, b, y));
73c4762a1bSJed Brown       /* Check the error */
749566063dSJacob Faibussowitsch       PetscCall(MatMult(A, y, x));
759566063dSJacob Faibussowitsch       PetscCall(VecAXPY(x, -1.0, b));
769566063dSJacob Faibussowitsch       PetscCall(VecNorm(x, NORM_2, &norm2));
7748a46eb9SPierre Jolivet       if (norm2 > tol) PetscCall(PetscPrintf(PETSC_COMM_WORLD, "Error:MatSolve(), norm2: %g\n", (double)norm2));
78c4762a1bSJed Brown     }
799566063dSJacob Faibussowitsch     PetscCall(MatDestroy(&F));
80c4762a1bSJed Brown   }
819566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&x));
829566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&y));
839566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&b));
849566063dSJacob Faibussowitsch   PetscCall(PetscRandomDestroy(&rdm));
85c4762a1bSJed Brown #endif
869566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&A));
873ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
88c4762a1bSJed Brown }
89c4762a1bSJed Brown 
main(int argc,char * argv[])90d71ae5a4SJacob Faibussowitsch int main(int argc, char *argv[])
91d71ae5a4SJacob Faibussowitsch {
92c4762a1bSJed Brown   MPI_Comm    comm;
93c4762a1bSJed Brown   PetscMPIInt size;
94c4762a1bSJed Brown 
95327415f7SBarry Smith   PetscFunctionBeginUser;
969566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
97c4762a1bSJed Brown   comm = PETSC_COMM_WORLD;
989566063dSJacob Faibussowitsch   PetscCallMPI(MPI_Comm_size(comm, &size));
99be096a46SBarry Smith   PetscCheck(size == 2, comm, PETSC_ERR_USER, "This example must be run with exactly two processes");
1009566063dSJacob Faibussowitsch   PetscCall(Assemble(comm, 2, MATMPIBAIJ));
1019566063dSJacob Faibussowitsch   PetscCall(Assemble(comm, 2, MATMPISBAIJ));
1029566063dSJacob Faibussowitsch   PetscCall(Assemble(comm, 1, MATMPIBAIJ));
1039566063dSJacob Faibussowitsch   PetscCall(Assemble(comm, 1, MATMPISBAIJ));
1049566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
105b122ec5aSJacob Faibussowitsch   return 0;
106c4762a1bSJed Brown }
107c4762a1bSJed Brown 
108c4762a1bSJed Brown /*TEST
109c4762a1bSJed Brown 
110c4762a1bSJed Brown    test:
111c4762a1bSJed Brown       nsize: 2
11297929ea7SJunchao Zhang       args: -mat_ignore_lower_triangular
113c4762a1bSJed Brown       filter: sed -e "s~mem [0-9]*~mem~g"
114c4762a1bSJed Brown 
115c4762a1bSJed Brown TEST*/
116