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