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