Actual source code: ex100f.F90

  1:       program main
  2: #include "petsc/finclude/petscksp.h"
  3:       use petscksp

  5:       PetscInt       N
  6:       PetscBool      draw, flg
  7:       PetscReal      rnorm,rtwo
  8:       PetscScalar    one,mone
  9:       Mat            A
 10:       Vec            b,x,r
 11:       KSP            ksp
 12:       PC             pc
 13:       PetscErrorCode ierr

 15:       N    = 100
 16:       draw = .FALSE.
 17:       one  =  1.0
 18:       mone = -1.0
 19:       rtwo = 2.0

 21:       PetscCallA(PetscInitialize(ierr))
 22:       PetscCallA(PetscPythonInitialize(PETSC_NULL_CHARACTER,PETSC_NULL_CHARACTER,ierr))

 24:       PetscCallA(PetscOptionsGetInt(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-N', N,flg,ierr))
 25:       PetscCallA(PetscOptionsGetBool(PETSC_NULL_OPTIONS,PETSC_NULL_CHARACTER,'-draw',draw,flg,ierr))

 27:       PetscCallA(MatCreate(PETSC_COMM_WORLD,A,ierr))
 28:       PetscCallA(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,N,N,ierr))
 29:       PetscCallA(MatSetType(A,'python',ierr))
 30:       PetscCallA(MatPythonSetType(A,'example100.py:Laplace1D',ierr))
 31:       PetscCallA(MatSetUp(A,ierr))

 33:       PetscCallA(MatCreateVecs(A,x,b,ierr))
 34:       PetscCallA(VecSet(b,one,ierr))

 36:       PetscCallA(KSPCreate(PETSC_COMM_WORLD,ksp,ierr))
 37:       PetscCallA(KSPSetType(ksp,'python',ierr))
 38:       PetscCallA(KSPPythonSetType(ksp,'example100.py:ConjGrad',ierr))

 40:       PetscCallA(KSPGetPC(ksp,pc,ierr))
 41:       PetscCallA(PCSetType(pc,'python',ierr))
 42:       PetscCallA(PCPythonSetType(pc,'example100.py:Jacobi',ierr))

 44:       PetscCallA(KSPSetOperators(ksp,A,A,ierr))
 45:       PetscCallA(KSPSetFromOptions(ksp,ierr))
 46:       PetscCallA(KSPSolve(ksp,b,x,ierr))

 48:       PetscCallA(VecDuplicate(b,r,ierr))
 49:       PetscCallA(MatMult(A,x,r,ierr))
 50:       PetscCallA(VecAYPX(r,mone,b,ierr))
 51:       PetscCallA(VecNorm(r,NORM_2,rnorm,ierr))
 52:       print*,'error norm = ',rnorm

 54:       if (draw) then
 55:          PetscCallA(VecView(x,PETSC_VIEWER_DRAW_WORLD,ierr))
 56:          PetscCallA(PetscSleep(rtwo,ierr))
 57:       endif

 59:       PetscCallA(VecDestroy(x,ierr))
 60:       PetscCallA(VecDestroy(b,ierr))
 61:       PetscCallA(VecDestroy(r,ierr))
 62:       PetscCallA(MatDestroy(A,ierr))
 63:       PetscCallA(KSPDestroy(ksp,ierr))

 65:       PetscCallA(PetscFinalize(ierr))
 66:       end

 68: !/*TEST
 69: !
 70: !    test:
 71: !      requires: petsc4py
 72: !      localrunfiles: example100.py
 73: !
 74: !TEST*/