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