1 static char help[] = "Example use of PetscInfo() as a configurable informative logging or warning tool\n"; 2 3 /*T 4 Concepts: introduction to logging techniques and introspection in PETSc; 5 Processors: n 6 T*/ 7 8 # include <petscsys.h> 9 # include <petscmat.h> 10 # include <petscvec.h> 11 12 int main(int argc, char **argv) 13 { 14 PetscErrorCode ierr; 15 Mat A, Aself; 16 Vec b, bself; 17 #if defined(PETSC_USE_INFO) 18 PetscInt testarg = 1234; 19 #endif 20 int numClasses; 21 PetscClassId testMatClassid, testVecClassid, testSysClassid; 22 PetscBool isEnabled = PETSC_FALSE, invert = PETSC_FALSE; 23 char *testClassesStr, *filename; 24 const char *testMatClassname, *testVecClassname; 25 char **testClassesStrArr; 26 FILE *infoFile; 27 28 ierr = PetscInitialize(&argc, &argv,(char *) 0, help);if (ierr) return ierr; 29 30 /* 31 Examples on how to call PetscInfo() using different objects with or without arguments, and different communicators. 32 - Until PetscInfoDestroy() is called all PetscInfo() behaviour is goverened by command line options, which 33 are processed during PetscInitialize(). 34 */ 35 ierr = MatCreate(PETSC_COMM_WORLD, &A);CHKERRQ(ierr); 36 ierr = VecCreate(PETSC_COMM_WORLD, &b);CHKERRQ(ierr); 37 38 ierr = PetscInfo(A, "Mat info on PETSC_COMM_WORLD with no arguments\n");CHKERRQ(ierr); 39 ierr = PetscInfo1(A, "Mat info on PETSC_COMM_WORLD with 1 argument equal to 1234: %D\n", testarg);CHKERRQ(ierr); 40 ierr = PetscInfo(b, "Vec info on PETSC_COMM_WORLD with no arguments\n");CHKERRQ(ierr); 41 ierr = PetscInfo1(b, "Vec info on PETSC_COMM_WORLD with 1 argument equal to 1234: %D\n", testarg);CHKERRQ(ierr); 42 ierr = PetscInfo(NULL, "Sys info on PETSC_COMM_WORLD with no arguments\n");CHKERRQ(ierr); 43 ierr = PetscInfo1(NULL, "Sys info on PETSC_COMM_WORLD with 1 argument equal to 1234: %D\n", testarg);CHKERRQ(ierr); 44 45 ierr = MatCreate(PETSC_COMM_SELF, &Aself);CHKERRQ(ierr); 46 ierr = VecCreate(PETSC_COMM_SELF, &bself);CHKERRQ(ierr); 47 48 ierr = PetscInfo(Aself, "Mat info on PETSC_COMM_SELF with no arguments\n");CHKERRQ(ierr); 49 ierr = PetscInfo1(Aself, "Mat info on PETSC_COMM_SELF with 1 argument equal to 1234: %D\n", testarg);CHKERRQ(ierr); 50 ierr = PetscInfo(bself, "Vec info on PETSC_COMM_SELF with no arguments\n");CHKERRQ(ierr); 51 ierr = PetscInfo1(bself, "Vec info on PETSC_COMM_SELF with 1 argument equal to 1234: %D\n", testarg);CHKERRQ(ierr); 52 ierr = PetscInfo(NULL, "Sys info on PETSC_COMM_SELF with no arguments\n");CHKERRQ(ierr); 53 ierr = PetscInfo1(NULL, "Sys info on PETSC_COMM_SELF with 1 argument equal to 1234: %D\n", testarg);CHKERRQ(ierr); 54 55 ierr = MatDestroy(&Aself);CHKERRQ(ierr); 56 ierr = VecDestroy(&bself);CHKERRQ(ierr); 57 /* 58 First retrieve some basic information regarding the classes for which we want to filter 59 */ 60 ierr = PetscObjectGetClassId((PetscObject) A, &testMatClassid);CHKERRQ(ierr); 61 ierr = PetscObjectGetClassId((PetscObject) b, &testVecClassid);CHKERRQ(ierr); 62 /* Sys class has PetscClassId = PETSC_SMALLEST_CLASSID */ 63 testSysClassid = PETSC_SMALLEST_CLASSID; 64 ierr = PetscObjectGetClassName((PetscObject) A, &testMatClassname);CHKERRQ(ierr); 65 ierr = PetscObjectGetClassName((PetscObject) b, &testVecClassname);CHKERRQ(ierr); 66 67 /* 68 Examples on how to use individual PetscInfo() commands. 69 */ 70 ierr = PetscInfoEnabled(testMatClassid, &isEnabled);CHKERRQ(ierr); 71 if (isEnabled) { ierr = PetscInfo(A, "Mat info is enabled\n");CHKERRQ(ierr);} 72 ierr = PetscInfoEnabled(testVecClassid, &isEnabled);CHKERRQ(ierr); 73 if (isEnabled) { ierr = PetscInfo(b, "Vec info is enabled\n");CHKERRQ(ierr);} 74 ierr = PetscInfoEnabled(testSysClassid, &isEnabled);CHKERRQ(ierr); 75 if (isEnabled) { ierr = PetscInfo(NULL, "Sys info is enabled\n");CHKERRQ(ierr);} 76 77 /* Retrieve filename to append later entries to */ 78 ierr = PetscInfoGetFile(&filename, &infoFile);CHKERRQ(ierr); 79 80 /* 81 Destroy existing PetscInfo() configuration and reset all internal flags to default values. This allows the user to change filters 82 midway through a program. 83 */ 84 ierr = PetscInfoDestroy();CHKERRQ(ierr); 85 86 /* 87 Test if existing filters are reset. 88 - Note these should NEVER print. 89 */ 90 ierr = PetscInfoEnabled(testMatClassid, &isEnabled);CHKERRQ(ierr); 91 if (isEnabled) { ierr = PetscInfo(A, "Mat info is enabled after PetscInfoDestroy\n");CHKERRQ(ierr);} 92 ierr = PetscInfoEnabled(testVecClassid, &isEnabled);CHKERRQ(ierr); 93 if (isEnabled) { ierr = PetscInfo(b, "Vec info is enabled after PetscInfoDestroy\n");CHKERRQ(ierr);} 94 ierr = PetscInfoEnabled(testSysClassid, &isEnabled);CHKERRQ(ierr); 95 if (isEnabled) { ierr = PetscInfo(NULL, "Sys info is enabled after PetscInfoDestroy\n");CHKERRQ(ierr);} 96 97 /* 98 Reactivate PetscInfo() printing in one of two ways. 99 - First we must reactivate PetscInfo() printing as a whole. 100 - Keep in mind that by default ALL classes are allowed to print if PetscInfo() is enabled, so we deactivate 101 relevant classes first to demonstrate activation functionality. 102 */ 103 ierr = PetscInfoAllow(PETSC_TRUE);CHKERRQ(ierr); 104 ierr = PetscInfoSetFile(filename, "a");CHKERRQ(ierr); 105 ierr = PetscInfoDeactivateClass(testMatClassid);CHKERRQ(ierr); 106 ierr = PetscInfoDeactivateClass(testVecClassid);CHKERRQ(ierr); 107 ierr = PetscInfoDeactivateClass(testSysClassid);CHKERRQ(ierr); 108 109 /* 110 Activate PetscInfo() on a per-class basis 111 */ 112 ierr = PetscInfoActivateClass(testMatClassid);CHKERRQ(ierr); 113 ierr = PetscInfo(A, "Mat info is enabled again through PetscInfoActivateClass\n");CHKERRQ(ierr); 114 ierr = PetscInfoDeactivateClass(testMatClassid);CHKERRQ(ierr); 115 ierr = PetscInfoActivateClass(testVecClassid);CHKERRQ(ierr); 116 ierr = PetscInfo(b, "Vec info is enabled again through PetscInfoActivateClass\n");CHKERRQ(ierr); 117 ierr = PetscInfoDeactivateClass(testVecClassid);CHKERRQ(ierr); 118 ierr = PetscInfoActivateClass(testSysClassid);CHKERRQ(ierr); 119 ierr = PetscInfo(NULL, "Sys info is enabled again through PetscInfoActivateClass\n");CHKERRQ(ierr); 120 ierr = PetscInfoDeactivateClass(testVecClassid);CHKERRQ(ierr); 121 122 /* 123 Activate PetscInfo() by specifying specific classnames to activate 124 */ 125 ierr = PetscStrallocpy("mat,vec,sys", &testClassesStr);CHKERRQ(ierr); 126 ierr = PetscStrToArray((const char *)testClassesStr, ',', &numClasses, &testClassesStrArr);CHKERRQ(ierr); 127 ierr = PetscInfoSetClasses(invert, (PetscInt) numClasses, (const char *const *) testClassesStrArr);CHKERRQ(ierr); 128 ierr = PetscInfoProcessClass(testMatClassname, 1, &testMatClassid);CHKERRQ(ierr); 129 ierr = PetscInfoProcessClass(testVecClassname, 1, &testVecClassid);CHKERRQ(ierr); 130 ierr = PetscInfoProcessClass("sys", 1, &testSysClassid);CHKERRQ(ierr); 131 132 ierr = PetscInfo(A, "Mat info is enabled again through PetscInfoSetClasses\n");CHKERRQ(ierr); 133 ierr = PetscInfo(b, "Vec info is enabled again through PetscInfoSetClasses\n");CHKERRQ(ierr); 134 ierr = PetscInfo(NULL, "Sys info is enabled again through PetscInfoSetClasses\n");CHKERRQ(ierr); 135 136 ierr = PetscStrToArrayDestroy(numClasses, testClassesStrArr);CHKERRQ(ierr); 137 ierr = PetscFree(testClassesStr);CHKERRQ(ierr); 138 139 /* 140 Activate PetscInfo() with an inverted filter selection. 141 - Inverting our selection of filters enables PetscInfo() for all classes EXCEPT those specified. 142 - Note we must reset PetscInfo() internal flags with PetscInfoDestroy() as invoking PetscInfoProcessClass() locks filters in place. 143 */ 144 ierr = PetscInfoDestroy();CHKERRQ(ierr); 145 ierr = PetscInfoAllow(PETSC_TRUE);CHKERRQ(ierr); 146 ierr = PetscInfoSetFile(filename, "a");CHKERRQ(ierr); 147 ierr = PetscStrallocpy("vec,sys", &testClassesStr);CHKERRQ(ierr); 148 ierr = PetscStrToArray((const char *)testClassesStr, ',', &numClasses, &testClassesStrArr);CHKERRQ(ierr); 149 invert = PETSC_TRUE; 150 ierr = PetscInfoSetClasses(invert, (PetscInt) numClasses, (const char *const *) testClassesStrArr);CHKERRQ(ierr); 151 ierr = PetscInfoProcessClass(testMatClassname, 1, &testMatClassid);CHKERRQ(ierr); 152 ierr = PetscInfoProcessClass(testVecClassname, 1, &testVecClassid);CHKERRQ(ierr); 153 ierr = PetscInfoProcessClass("sys", 1, &testSysClassid);CHKERRQ(ierr); 154 155 /* 156 Here only the Mat() call will successfully print. 157 */ 158 ierr = PetscInfo(A, "Mat info is enabled again through inverted PetscInfoSetClasses\n");CHKERRQ(ierr); 159 ierr = PetscInfo(b, "Vec info is enabled again through PetscInfoSetClasses\n");CHKERRQ(ierr); 160 ierr = PetscInfo(NULL, "Sys info is enabled again through PetscInfoSetClasses\n");CHKERRQ(ierr); 161 162 ierr = PetscStrToArrayDestroy(numClasses, testClassesStrArr);CHKERRQ(ierr); 163 ierr = PetscFree(testClassesStr);CHKERRQ(ierr); 164 ierr = PetscFree(filename);CHKERRQ(ierr); 165 ierr = MatDestroy(&A);CHKERRQ(ierr); 166 ierr = VecDestroy(&b);CHKERRQ(ierr); 167 ierr = PetscFinalize();CHKERRQ(ierr); 168 return ierr; 169 } 170 171 /*TEST 172 173 test: 174 requires: define(PETSC_USE_INFO) 175 suffix: 1 176 args: -info 177 filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscDetermineInitialFPTrap -ve libpetscbamg 178 179 test: 180 requires: define(PETSC_USE_INFO) 181 suffix: 2 182 args: -info ex7info.2 183 filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscDetermineInitialFPTrap -ve libpetscbamg "ex7info.2.0" 184 185 test: 186 requires: define(PETSC_USE_INFO) 187 suffix: 3 188 nsize: 2 189 args: -info ex7info.3 190 filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscDetermineInitialFPTrap -ve libpetscbamg "ex7info.3.0" | sort -b 191 192 test: 193 requires: define(PETSC_USE_INFO) 194 suffix: 4 195 args: -info :mat,vec: 196 filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscDetermineInitialFPTrap 197 198 test: 199 requires: define(PETSC_USE_INFO) 200 suffix: 5 201 args: -info :~sys: 202 filter: grep -h -ve PetscDetermineInitialFPTrap 203 204 test: 205 requires: define(PETSC_USE_INFO) 206 suffix: 6 207 nsize: 2 208 args: -info ex7info.6:mat:self 209 filter: grep -h "ex7info.6.0" | sort -b 210 211 test: 212 requires: define(PETSC_USE_INFO) 213 suffix: 7 214 nsize: 2 215 args: -info ex7info.7:mat:~self 216 filter: grep -h "ex7info.7.0" | sort -b 217 218 TEST*/ 219