Date: 2022-03-31T04:48:22+00:00

Actual source code: ex100.c

      1: #include <petscksp.h>

      3: /* ------------------------------------------------------- */

      5: PetscErrorCode RunTest(void)
      6: {
      7:   PetscInt       N    = 100, its = 0;
      8:   PetscBool      draw = PETSC_FALSE, test = PETSC_FALSE;
      9:   PetscReal      rnorm;
     10:   Mat            A;
     11:   Vec            b,x,r;
     12:   KSP            ksp;
     13:   PC             pc;

     16:   PetscOptionsGetInt(NULL,NULL,"-N",&N,NULL);
     17:   PetscOptionsGetBool(NULL,NULL,"-test",&test,NULL);
     18:   PetscOptionsGetBool(NULL,NULL,"-draw",&draw,NULL);

     20:   MatCreate(PETSC_COMM_WORLD,&A);
     21:   MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,N,N);
     22:   MatSetType(A,MATPYTHON);
     23:   MatPythonSetType(A,"example100.py:Laplace1D");
     24:   MatSetUp(A);

     26:   MatCreateVecs(A,&x,&b);
     27:   VecSet(b,1);

     29:   KSPCreate(PETSC_COMM_WORLD,&ksp);
     30:   KSPSetType(ksp,KSPPYTHON);
     31:   KSPPythonSetType(ksp,"example100.py:ConjGrad");

     33:   KSPGetPC(ksp,&pc);
     34:   PCSetType(pc,PCPYTHON);
     35:   PCPythonSetType(pc,"example100.py:Jacobi");

     37:   KSPSetOperators(ksp,A,A);
     38:   KSPSetFromOptions(ksp);
     39:   KSPSolve(ksp,b,x);

     41:   if (test) {
     42:     KSPGetTotalIterations(ksp,&its);
     43:     PetscPrintf(PETSC_COMM_WORLD,"Number of KSP iterations = %D\n", its);
     44:   } else {
     45:     VecDuplicate(b,&r);
     46:     MatMult(A,x,r);
     47:     VecAYPX(r,-1,b);
     48:     VecNorm(r,NORM_2,&rnorm);
     49:     PetscPrintf(PETSC_COMM_WORLD,"error norm = %g\n",rnorm);
     50:     VecDestroy(&r);
     51:   }

     53:   if (draw) {
     54:     VecView(x,PETSC_VIEWER_DRAW_WORLD);
     55:     PetscSleep(2);
     56:   }

     58:   VecDestroy(&x);
     59:   VecDestroy(&b);
     60:   MatDestroy(&A);
     61:   KSPDestroy(&ksp);

     63:   return 0;
     64: }

     66: /* ------------------------------------------------------- */

     68: static char help[] = "Python-implemented Mat/KSP/PC.\n\n";

     70: /*
     71: #define PYTHON_EXE "python2.5"
     72: #define PYTHON_LIB "/usr/lib/libpython2.5"
     73: */

     75: #if !defined(PYTHON_EXE)
     76: #define PYTHON_EXE 0
     77: #endif
     78: #if !defined(PYTHON_LIB)
     79: #define PYTHON_LIB 0
     80: #endif

     82: int main(int argc, char *argv[])
     83: {

     85:   PetscInitialize(&argc,&argv,0,help);
     86:   PetscPythonInitialize(PYTHON_EXE,PYTHON_LIB);
     87:   RunTest();PetscPythonPrintError();
     88:   PetscFinalize();
     89:   return 0;
     90: }

     92: /*TEST

     94:     test:
     95:       args: -ksp_monitor_short
     96:       requires: petsc4py
     97:       localrunfiles: example100.py

     99: TEST*/