xref: /petsc/src/ksp/ksp/tests/ex61.c (revision 061e922f3926be00487707c73b78dd3d40309129)
16aad120cSJose E. Roman static char help[] = " * Example code testing SeqDense matrices with an LDA (leading dimension of the user-allocated array) larger than M.\n";
2c4762a1bSJed Brown 
3c4762a1bSJed Brown #include <petscksp.h>
4c4762a1bSJed Brown 
main(int argc,char ** argv)5*d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
6*d71ae5a4SJacob Faibussowitsch {
7c4762a1bSJed Brown   KSP          solver;
8c4762a1bSJed Brown   PC           pc;
9c4762a1bSJed Brown   Mat          A, B;
10c4762a1bSJed Brown   Vec          X, Y, Z;
11c4762a1bSJed Brown   MatScalar   *a;
12c4762a1bSJed Brown   PetscScalar *b, *x, *y, *z;
13c4762a1bSJed Brown   PetscReal    nrm;
14b122ec5aSJacob Faibussowitsch   PetscInt     size = 8, lda = 10, i, j;
15c4762a1bSJed Brown 
16327415f7SBarry Smith   PetscFunctionBeginUser;
179566063dSJacob Faibussowitsch   PetscCall(PetscInitialize(&argc, &argv, 0, help));
18c4762a1bSJed Brown   /* Create matrix and three vectors: these are all normal */
199566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(lda * size, &b));
20c4762a1bSJed Brown   for (i = 0; i < size; i++) {
21ad540459SPierre Jolivet     for (j = 0; j < size; j++) b[i + j * lda] = rand();
22c4762a1bSJed Brown   }
239566063dSJacob Faibussowitsch   PetscCall(MatCreate(MPI_COMM_SELF, &A));
249566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(A, size, size, size, size));
259566063dSJacob Faibussowitsch   PetscCall(MatSetType(A, MATSEQDENSE));
269566063dSJacob Faibussowitsch   PetscCall(MatSeqDenseSetPreallocation(A, NULL));
27c4762a1bSJed Brown 
289566063dSJacob Faibussowitsch   PetscCall(MatDenseGetArray(A, &a));
29c4762a1bSJed Brown   for (i = 0; i < size; i++) {
30ad540459SPierre Jolivet     for (j = 0; j < size; j++) a[i + j * size] = b[i + j * lda];
31c4762a1bSJed Brown   }
329566063dSJacob Faibussowitsch   PetscCall(MatDenseRestoreArray(A, &a));
339566063dSJacob Faibussowitsch   PetscCall(MatAssemblyBegin(A, MAT_FINAL_ASSEMBLY));
349566063dSJacob Faibussowitsch   PetscCall(MatAssemblyEnd(A, MAT_FINAL_ASSEMBLY));
35c4762a1bSJed Brown 
369566063dSJacob Faibussowitsch   PetscCall(MatCreate(MPI_COMM_SELF, &B));
379566063dSJacob Faibussowitsch   PetscCall(MatSetSizes(B, size, size, size, size));
389566063dSJacob Faibussowitsch   PetscCall(MatSetType(B, MATSEQDENSE));
399566063dSJacob Faibussowitsch   PetscCall(MatSeqDenseSetPreallocation(B, b));
409566063dSJacob Faibussowitsch   PetscCall(MatDenseSetLDA(B, lda));
419566063dSJacob Faibussowitsch   PetscCall(MatAssemblyBegin(B, MAT_FINAL_ASSEMBLY));
429566063dSJacob Faibussowitsch   PetscCall(MatAssemblyEnd(B, MAT_FINAL_ASSEMBLY));
43c4762a1bSJed Brown 
449566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(size, &x));
45c4762a1bSJed Brown   for (i = 0; i < size; i++) x[i] = 1.0;
469566063dSJacob Faibussowitsch   PetscCall(VecCreateSeqWithArray(MPI_COMM_SELF, 1, size, x, &X));
479566063dSJacob Faibussowitsch   PetscCall(VecAssemblyBegin(X));
489566063dSJacob Faibussowitsch   PetscCall(VecAssemblyEnd(X));
49c4762a1bSJed Brown 
509566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(size, &y));
519566063dSJacob Faibussowitsch   PetscCall(VecCreateSeqWithArray(MPI_COMM_SELF, 1, size, y, &Y));
529566063dSJacob Faibussowitsch   PetscCall(VecAssemblyBegin(Y));
539566063dSJacob Faibussowitsch   PetscCall(VecAssemblyEnd(Y));
54c4762a1bSJed Brown 
559566063dSJacob Faibussowitsch   PetscCall(PetscMalloc1(size, &z));
569566063dSJacob Faibussowitsch   PetscCall(VecCreateSeqWithArray(MPI_COMM_SELF, 1, size, z, &Z));
579566063dSJacob Faibussowitsch   PetscCall(VecAssemblyBegin(Z));
589566063dSJacob Faibussowitsch   PetscCall(VecAssemblyEnd(Z));
59c4762a1bSJed Brown 
60c4762a1bSJed Brown   /*
61c4762a1bSJed Brown    * Solve with A and B
62c4762a1bSJed Brown    */
639566063dSJacob Faibussowitsch   PetscCall(KSPCreate(MPI_COMM_SELF, &solver));
649566063dSJacob Faibussowitsch   PetscCall(KSPSetType(solver, KSPPREONLY));
659566063dSJacob Faibussowitsch   PetscCall(KSPGetPC(solver, &pc));
669566063dSJacob Faibussowitsch   PetscCall(PCSetType(pc, PCLU));
679566063dSJacob Faibussowitsch   PetscCall(KSPSetOperators(solver, A, A));
689566063dSJacob Faibussowitsch   PetscCall(KSPSolve(solver, X, Y));
699566063dSJacob Faibussowitsch   PetscCall(KSPSetOperators(solver, B, B));
709566063dSJacob Faibussowitsch   PetscCall(KSPSolve(solver, X, Z));
719566063dSJacob Faibussowitsch   PetscCall(VecAXPY(Z, -1.0, Y));
729566063dSJacob Faibussowitsch   PetscCall(VecNorm(Z, NORM_2, &nrm));
7363a3b9bcSJacob Faibussowitsch   PetscCall(PetscPrintf(PETSC_COMM_SELF, "Test1; error norm=%e\n", (double)nrm));
74c4762a1bSJed Brown 
75c4762a1bSJed Brown   /* Free spaces */
769566063dSJacob Faibussowitsch   PetscCall(PetscFree(b));
779566063dSJacob Faibussowitsch   PetscCall(PetscFree(x));
789566063dSJacob Faibussowitsch   PetscCall(PetscFree(y));
799566063dSJacob Faibussowitsch   PetscCall(PetscFree(z));
809566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&X));
819566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&Y));
829566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&Z));
839566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&A));
849566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&B));
859566063dSJacob Faibussowitsch   PetscCall(KSPDestroy(&solver));
86c4762a1bSJed Brown 
879566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
88b122ec5aSJacob Faibussowitsch   return 0;
89c4762a1bSJed Brown }
90c4762a1bSJed Brown 
91c4762a1bSJed Brown /*TEST
92c4762a1bSJed Brown 
93c4762a1bSJed Brown    test:
94c4762a1bSJed Brown 
95c4762a1bSJed Brown TEST*/
96