LCOV - code coverage report
Current view: top level - sys/classes/st/tests - test5.c (source / functions) Hit Total Coverage
Test: SLEPc Lines: 81 89 91.0 %
Date: 2024-11-21 00:34:55 Functions: 1 1 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : /*
       2             :    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
       3             :    SLEPc - Scalable Library for Eigenvalue Problem Computations
       4             :    Copyright (c) 2002-, Universitat Politecnica de Valencia, Spain
       5             : 
       6             :    This file is part of SLEPc.
       7             :    SLEPc is distributed under a 2-clause BSD license (see LICENSE).
       8             :    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
       9             : */
      10             : 
      11             : static char help[] = "Test various ST interface functions.\n\n";
      12             : 
      13             : #include <slepceps.h>
      14             : 
      15           3 : int main (int argc,char **argv)
      16             : {
      17           3 :   ST             st;
      18           3 :   KSP            ksp;
      19           3 :   PC             pc;
      20           3 :   Mat            A,mat[1],Op;
      21           3 :   Vec            v,w;
      22           3 :   PetscInt       N,n=4,i,j,II,Istart,Iend;
      23           3 :   PetscScalar    d,val1,val2;
      24           3 :   PetscBool      test_compl=PETSC_FALSE;
      25             : 
      26           3 :   PetscFunctionBeginUser;
      27           3 :   PetscCall(SlepcInitialize(&argc,&argv,NULL,help));
      28           3 :   PetscCall(PetscOptionsGetBool(NULL,NULL,"-complex",&test_compl,NULL));
      29           3 :   PetscCall(PetscOptionsGetInt(NULL,NULL,"-n",&n,NULL));
      30           3 :   N = n*n;
      31             : 
      32             :   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      33             :      Create non-symmetric matrix
      34             :      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
      35             : 
      36           3 :   PetscCall(MatCreate(PETSC_COMM_WORLD,&A));
      37           3 :   PetscCall(MatSetSizes(A,PETSC_DECIDE,PETSC_DECIDE,N,N));
      38           3 :   PetscCall(MatSetFromOptions(A));
      39             : 
      40           3 :   PetscCall(MatGetOwnershipRange(A,&Istart,&Iend));
      41             : #if defined(PETSC_USE_COMPLEX)
      42             :   val1 = test_compl? PetscCMPLX(1.0,-0.2): 1.0;
      43             :   val2 = test_compl? PetscCMPLX(-1.0,0.4): -1.0;
      44             : #else
      45           3 :   val1 = 1.0;
      46           3 :   val2 = -1.0;
      47             : #endif
      48          51 :   for (II=Istart;II<Iend;II++) {
      49          48 :     i = II/n; j = II-i*n;
      50          48 :     d = 0.0;
      51          48 :     if (i>0) { PetscCall(MatSetValue(A,II,II-n,val1,INSERT_VALUES)); d=d+1.0; }
      52          48 :     if (i<n-1) { PetscCall(MatSetValue(A,II,II+n,val2,INSERT_VALUES)); d=d+1.0; }
      53          48 :     if (j>0) { PetscCall(MatSetValue(A,II,II-1,val1,INSERT_VALUES)); d=d+1.0; }
      54          48 :     if (j<n-1) { PetscCall(MatSetValue(A,II,II+1,val2,INSERT_VALUES)); d=d+1.0; }
      55          48 :     PetscCall(MatSetValue(A,II,II,d,INSERT_VALUES));
      56             :   }
      57           3 :   PetscCall(MatAssemblyBegin(A,MAT_FINAL_ASSEMBLY));
      58           3 :   PetscCall(MatAssemblyEnd(A,MAT_FINAL_ASSEMBLY));
      59             : 
      60             : #if defined(PETSC_USE_COMPLEX)
      61             :   val1 = test_compl? PetscCMPLX(-0.5,0.01): -0.5;
      62             : #else
      63           3 :   val1 = -0.5;
      64             : #endif
      65           3 :   PetscCall(MatCreateVecs(A,&v,&w));
      66           3 :   PetscCall(VecSetValue(v,0,val1,INSERT_VALUES));
      67           3 :   PetscCall(VecSetValue(v,1,1.5,INSERT_VALUES));
      68           3 :   PetscCall(VecSetValue(v,2,2,INSERT_VALUES));
      69           3 :   PetscCall(VecAssemblyBegin(v));
      70           3 :   PetscCall(VecAssemblyEnd(v));
      71           3 :   PetscCall(VecView(v,NULL));
      72             : 
      73             :   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      74             :      Create the spectral transformation object
      75             :      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
      76           3 :   PetscCall(STCreate(PETSC_COMM_WORLD,&st));
      77           3 :   mat[0] = A;
      78           3 :   PetscCall(STSetMatrices(st,1,mat));
      79           3 :   PetscCall(STSetType(st,STCAYLEY));
      80           3 :   PetscCall(STSetShift(st,2.0));
      81           3 :   PetscCall(STCayleySetAntishift(st,1.0));
      82           3 :   PetscCall(STSetTransform(st,PETSC_TRUE));
      83             : 
      84           3 :   PetscCall(KSPCreate(PETSC_COMM_WORLD,&ksp));
      85           3 :   PetscCall(KSPSetType(ksp,KSPPREONLY));
      86           3 :   PetscCall(KSPGetPC(ksp,&pc));
      87           3 :   PetscCall(PCSetType(pc,PCLU));
      88           3 :   PetscCall(KSPSetTolerances(ksp,100*PETSC_MACHINE_EPSILON,PETSC_CURRENT,PETSC_CURRENT,PETSC_CURRENT));
      89           3 :   PetscCall(KSPSetFromOptions(ksp));
      90           3 :   PetscCall(STSetKSP(st,ksp));
      91           3 :   PetscCall(KSPDestroy(&ksp));
      92             : 
      93           3 :   PetscCall(STSetFromOptions(st));
      94             : 
      95             :   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
      96             :      Apply the operator
      97             :      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
      98           3 :   PetscCall(STApply(st,v,w));
      99           3 :   PetscCall(VecView(w,NULL));
     100             : 
     101           3 :   PetscCall(STApplyTranspose(st,v,w));
     102           3 :   PetscCall(VecView(w,NULL));
     103             : 
     104           3 :   if (test_compl) {
     105           0 :     PetscCall(STApplyHermitianTranspose(st,v,w));
     106           0 :     PetscCall(VecView(w,NULL));
     107             :   }
     108             : 
     109           3 :   PetscCall(STMatMult(st,1,v,w));
     110           3 :   PetscCall(VecView(w,NULL));
     111             : 
     112           3 :   PetscCall(STMatMultTranspose(st,1,v,w));
     113           3 :   PetscCall(VecView(w,NULL));
     114             : 
     115           3 :   if (test_compl) {
     116           0 :     PetscCall(STMatMultHermitianTranspose(st,1,v,w));
     117           0 :     PetscCall(VecView(w,NULL));
     118             :   }
     119             : 
     120           3 :   PetscCall(STMatSolve(st,v,w));
     121           3 :   PetscCall(VecView(w,NULL));
     122             : 
     123           3 :   PetscCall(STMatSolveTranspose(st,v,w));
     124           3 :   PetscCall(VecView(w,NULL));
     125             : 
     126           3 :   if (test_compl) {
     127           0 :     PetscCall(STMatSolveHermitianTranspose(st,v,w));
     128           0 :     PetscCall(VecView(w,NULL));
     129             :   }
     130             : 
     131             :   /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
     132             :      Get the operator matrix
     133             :      - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - */
     134           3 :   PetscCall(STGetOperator(st,&Op));
     135           3 :   PetscCall(MatMult(Op,v,w));
     136           3 :   PetscCall(VecView(w,NULL));
     137           3 :   PetscCall(MatMultTranspose(Op,v,w));
     138           3 :   PetscCall(VecView(w,NULL));
     139           3 :   if (test_compl) {
     140           0 :     PetscCall(MatMultHermitianTranspose(Op,v,w));
     141           0 :     PetscCall(VecView(w,NULL));
     142             :   }
     143           3 :   PetscCall(STRestoreOperator(st,&Op));
     144             : 
     145           3 :   PetscCall(STDestroy(&st));
     146           3 :   PetscCall(MatDestroy(&A));
     147           3 :   PetscCall(VecDestroy(&v));
     148           3 :   PetscCall(VecDestroy(&w));
     149           3 :   PetscCall(SlepcFinalize());
     150             :   return 0;
     151             : }
     152             : 
     153             : /*TEST
     154             : 
     155             :    testset:
     156             :       output_file: output/test5_1.out
     157             :       requires: !single
     158             :       test:
     159             :          suffix: 1
     160             :          args: -st_matmode {{copy inplace}}
     161             :       test:
     162             :          suffix: 1_shell
     163             :          args: -st_matmode shell -ksp_type bcgs -pc_type jacobi
     164             : 
     165             :    testset:
     166             :       output_file: output/test5_2.out
     167             :       requires: complex !single
     168             :       args: -complex
     169             :       test:
     170             :          suffix: 2
     171             :          args: -st_matmode {{copy inplace}}
     172             :       test:
     173             :          suffix: 2_shell
     174             :          args: -st_matmode shell -ksp_type bcgs -pc_type jacobi
     175             : 
     176             : TEST*/

Generated by: LCOV version 1.14