xref: /petsc/src/sys/tests/ex39.c (revision 2fa40bb9206b96114faa7cb222621ec184d31cd2)
1 static char help[] = "Tests PetscIsCloseAtTol() routine.\n";
2 
3 #include <petscsys.h>
4 
5 PETSC_INTERN PetscReal zero;
6 PetscReal zero = 0;
7 PETSC_INTERN PetscReal zero2;
8 PetscReal zero2 = 0;
9 
10 #define CALL(call) do { \
11     PetscErrorCode _ierr;                                               \
12     _ierr = PetscPrintf(PETSC_COMM_WORLD,"%s -> %s\n",#call,(call)?"True":"False");CHKERRQ(_ierr); \
13   } while (0);
14 
15 int main(int argc, char **argv) {
16 
17   PetscReal eps      = PETSC_MACHINE_EPSILON;
18   PetscReal neg_zero = PetscRealConstant(-0.0);
19   PetscReal pos_zero = PetscRealConstant(+0.0);
20   PetscReal neg_one  = PetscRealConstant(-1.0);
21   PetscReal pos_one  = PetscRealConstant(+1.0);
22   PetscReal neg_inf  = neg_one/zero; /* -inf */
23   PetscReal pos_inf  = pos_one/zero; /* +inf */
24   PetscReal x_nan    = zero2/zero;   /*  NaN */ /* some compilers may optimize out zero/zero and set x_nan = 1! */
25 
26   PetscErrorCode ierr;
27   ierr = PetscInitialize(&argc,&argv,NULL,help);if (ierr) return ierr;
28 
29   CALL(PetscIsCloseAtTol(pos_zero,neg_zero,0,0));
30   CALL(PetscIsCloseAtTol(pos_one,pos_one,0,0));
31   CALL(PetscIsCloseAtTol(pos_one,neg_one,0,0));
32   CALL(PetscIsCloseAtTol(pos_one,neg_one,0,2));
33   CALL(PetscIsCloseAtTol(pos_one,neg_one,2,0));
34 
35   CALL(PetscIsCloseAtTol(pos_one+eps,pos_one,0,0));
36   CALL(PetscIsCloseAtTol(pos_one-eps,pos_one,0,0));
37   CALL(PetscIsCloseAtTol(pos_one+eps,pos_one,0,0));
38   CALL(PetscIsCloseAtTol(pos_one-eps,pos_one,0,0));
39 
40   CALL(PetscIsCloseAtTol(pos_one+eps,pos_one,0,eps));
41   CALL(PetscIsCloseAtTol(pos_one-eps,pos_one,0,eps));
42   CALL(PetscIsCloseAtTol(pos_one+eps,pos_one,eps,0));
43   CALL(PetscIsCloseAtTol(pos_one-eps,pos_one,eps,0));
44 
45   CALL(PetscIsCloseAtTol(pos_one+2*eps,pos_one,eps,0));
46   CALL(PetscIsCloseAtTol(pos_one-2*eps,pos_one,eps,0));
47   CALL(PetscIsCloseAtTol(pos_one+2*eps,pos_one,0,eps));
48   CALL(PetscIsCloseAtTol(pos_one-2*eps,pos_one,0,eps));
49 
50   CALL(PetscIsCloseAtTol(neg_inf,neg_zero,2,2));
51   CALL(PetscIsCloseAtTol(neg_inf,pos_zero,2,2));
52   CALL(PetscIsCloseAtTol(neg_inf,neg_one,2,2));
53   CALL(PetscIsCloseAtTol(neg_inf,pos_one,2,2));
54   CALL(PetscIsCloseAtTol(neg_inf,neg_inf,2,2));
55   CALL(PetscIsCloseAtTol(neg_inf,pos_inf,2,2));
56   CALL(PetscIsCloseAtTol(neg_inf,x_nan,2,2));
57 
58   CALL(PetscIsCloseAtTol(pos_inf,neg_zero,2,2));
59   CALL(PetscIsCloseAtTol(pos_inf,pos_zero,2,2));
60   CALL(PetscIsCloseAtTol(pos_inf,neg_one,2,2));
61   CALL(PetscIsCloseAtTol(pos_inf,pos_one,2,2));
62   CALL(PetscIsCloseAtTol(pos_inf,neg_inf,2,2));
63   CALL(PetscIsCloseAtTol(pos_inf,pos_inf,2,2));
64   CALL(PetscIsCloseAtTol(pos_inf,x_nan,2,2));
65 
66   CALL(PetscIsCloseAtTol(x_nan,neg_zero,2,2));
67   CALL(PetscIsCloseAtTol(x_nan,pos_zero,2,2));
68   CALL(PetscIsCloseAtTol(x_nan,neg_one,2,2));
69   CALL(PetscIsCloseAtTol(x_nan,pos_one,2,2));
70   CALL(PetscIsCloseAtTol(x_nan,neg_inf,2,2));
71   CALL(PetscIsCloseAtTol(x_nan,pos_inf,2,2));
72   CALL(PetscIsCloseAtTol(x_nan,x_nan,2,2));
73 
74   ierr = PetscFinalize();
75   return ierr;
76 }
77 
78 /*TEST
79 
80    test:
81       output_file: output/ex39.out
82 
83 TEST*/
84