1c20d7725SJed Brown static char help[] = "Example use of PetscInfo() as a configurable informative logging or warning tool\n"; 2c20d7725SJed Brown 3c20d7725SJed Brown #include <petscsys.h> 4c20d7725SJed Brown #include <petscmat.h> 5c20d7725SJed Brown #include <petscvec.h> 6c20d7725SJed Brown 7d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv) 8d71ae5a4SJacob Faibussowitsch { 9c20d7725SJed Brown Mat A, Aself; 10c20d7725SJed Brown Vec b, bself; 11956f8c0dSBarry Smith #if defined(PETSC_USE_INFO) 12c20d7725SJed Brown PetscInt testarg = 1234; 13956f8c0dSBarry Smith #endif 14c20d7725SJed Brown int numClasses; 15c20d7725SJed Brown PetscClassId testMatClassid, testVecClassid, testSysClassid; 16c20d7725SJed Brown PetscBool isEnabled = PETSC_FALSE, invert = PETSC_FALSE; 17c20d7725SJed Brown char *testClassesStr, *filename; 18c20d7725SJed Brown const char *testMatClassname, *testVecClassname; 19c20d7725SJed Brown char **testClassesStrArr; 20c20d7725SJed Brown FILE *infoFile; 21c20d7725SJed Brown 22327415f7SBarry Smith PetscFunctionBeginUser; 23c8025a54SPierre Jolivet PetscCall(PetscInitialize(&argc, &argv, NULL, help)); 24c20d7725SJed Brown 25c20d7725SJed Brown /* 26c20d7725SJed Brown Examples on how to call PetscInfo() using different objects with or without arguments, and different communicators. 27c20d7725SJed Brown - Until PetscInfoDestroy() is called all PetscInfo() behaviour is goverened by command line options, which 28c20d7725SJed Brown are processed during PetscInitialize(). 29c20d7725SJed Brown */ 309566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &A)); 319566063dSJacob Faibussowitsch PetscCall(VecCreate(PETSC_COMM_WORLD, &b)); 32c20d7725SJed Brown 339566063dSJacob Faibussowitsch PetscCall(PetscInfo(A, "Mat info on PETSC_COMM_WORLD with no arguments\n")); 349566063dSJacob Faibussowitsch PetscCall(PetscInfo(A, "Mat info on PETSC_COMM_WORLD with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 359566063dSJacob Faibussowitsch PetscCall(PetscInfo(b, "Vec info on PETSC_COMM_WORLD with no arguments\n")); 369566063dSJacob Faibussowitsch PetscCall(PetscInfo(b, "Vec info on PETSC_COMM_WORLD with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 379566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Sys info on PETSC_COMM_WORLD with no arguments\n")); 389566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Sys info on PETSC_COMM_WORLD with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 39c20d7725SJed Brown 409566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_SELF, &Aself)); 419566063dSJacob Faibussowitsch PetscCall(VecCreate(PETSC_COMM_SELF, &bself)); 42c20d7725SJed Brown 439566063dSJacob Faibussowitsch PetscCall(PetscInfo(Aself, "Mat info on PETSC_COMM_SELF with no arguments\n")); 449566063dSJacob Faibussowitsch PetscCall(PetscInfo(Aself, "Mat info on PETSC_COMM_SELF with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 459566063dSJacob Faibussowitsch PetscCall(PetscInfo(bself, "Vec info on PETSC_COMM_SELF with no arguments\n")); 469566063dSJacob Faibussowitsch PetscCall(PetscInfo(bself, "Vec info on PETSC_COMM_SELF with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 479566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Sys info on PETSC_COMM_SELF with no arguments\n")); 489566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Sys info on PETSC_COMM_SELF with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 49c20d7725SJed Brown 509566063dSJacob Faibussowitsch PetscCall(MatDestroy(&Aself)); 519566063dSJacob Faibussowitsch PetscCall(VecDestroy(&bself)); 52c20d7725SJed Brown /* 53c20d7725SJed Brown First retrieve some basic information regarding the classes for which we want to filter 54c20d7725SJed Brown */ 559566063dSJacob Faibussowitsch PetscCall(PetscObjectGetClassId((PetscObject)A, &testMatClassid)); 569566063dSJacob Faibussowitsch PetscCall(PetscObjectGetClassId((PetscObject)b, &testVecClassid)); 57c20d7725SJed Brown /* Sys class has PetscClassId = PETSC_SMALLEST_CLASSID */ 58c20d7725SJed Brown testSysClassid = PETSC_SMALLEST_CLASSID; 599566063dSJacob Faibussowitsch PetscCall(PetscObjectGetClassName((PetscObject)A, &testMatClassname)); 609566063dSJacob Faibussowitsch PetscCall(PetscObjectGetClassName((PetscObject)b, &testVecClassname)); 61c20d7725SJed Brown 62c20d7725SJed Brown /* 63c20d7725SJed Brown Examples on how to use individual PetscInfo() commands. 64c20d7725SJed Brown */ 659566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(testMatClassid, &isEnabled)); 669566063dSJacob Faibussowitsch if (isEnabled) PetscCall(PetscInfo(A, "Mat info is enabled\n")); 679566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(testVecClassid, &isEnabled)); 689566063dSJacob Faibussowitsch if (isEnabled) PetscCall(PetscInfo(b, "Vec info is enabled\n")); 699566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(testSysClassid, &isEnabled)); 709566063dSJacob Faibussowitsch if (isEnabled) PetscCall(PetscInfo(NULL, "Sys info is enabled\n")); 71c20d7725SJed Brown 72c20d7725SJed Brown /* Retrieve filename to append later entries to */ 739566063dSJacob Faibussowitsch PetscCall(PetscInfoGetFile(&filename, &infoFile)); 74c20d7725SJed Brown 75c20d7725SJed Brown /* 76c20d7725SJed Brown Destroy existing PetscInfo() configuration and reset all internal flags to default values. This allows the user to change filters 77c20d7725SJed Brown midway through a program. 78c20d7725SJed Brown */ 799566063dSJacob Faibussowitsch PetscCall(PetscInfoDestroy()); 80c20d7725SJed Brown 81c20d7725SJed Brown /* 82c20d7725SJed Brown Test if existing filters are reset. 83c20d7725SJed Brown - Note these should NEVER print. 84c20d7725SJed Brown */ 859566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(testMatClassid, &isEnabled)); 869566063dSJacob Faibussowitsch if (isEnabled) PetscCall(PetscInfo(A, "Mat info is enabled after PetscInfoDestroy\n")); 879566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(testVecClassid, &isEnabled)); 889566063dSJacob Faibussowitsch if (isEnabled) PetscCall(PetscInfo(b, "Vec info is enabled after PetscInfoDestroy\n")); 899566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(testSysClassid, &isEnabled)); 909566063dSJacob Faibussowitsch if (isEnabled) PetscCall(PetscInfo(NULL, "Sys info is enabled after PetscInfoDestroy\n")); 91c20d7725SJed Brown 92c20d7725SJed Brown /* 93c20d7725SJed Brown Reactivate PetscInfo() printing in one of two ways. 94c20d7725SJed Brown - First we must reactivate PetscInfo() printing as a whole. 95c20d7725SJed Brown - Keep in mind that by default ALL classes are allowed to print if PetscInfo() is enabled, so we deactivate 96c20d7725SJed Brown relevant classes first to demonstrate activation functionality. 97c20d7725SJed Brown */ 989566063dSJacob Faibussowitsch PetscCall(PetscInfoAllow(PETSC_TRUE)); 999566063dSJacob Faibussowitsch PetscCall(PetscInfoSetFile(filename, "a")); 1009566063dSJacob Faibussowitsch PetscCall(PetscInfoDeactivateClass(testMatClassid)); 1019566063dSJacob Faibussowitsch PetscCall(PetscInfoDeactivateClass(testVecClassid)); 1029566063dSJacob Faibussowitsch PetscCall(PetscInfoDeactivateClass(testSysClassid)); 103c20d7725SJed Brown 104c20d7725SJed Brown /* 105c20d7725SJed Brown Activate PetscInfo() on a per-class basis 106c20d7725SJed Brown */ 1079566063dSJacob Faibussowitsch PetscCall(PetscInfoActivateClass(testMatClassid)); 1089566063dSJacob Faibussowitsch PetscCall(PetscInfo(A, "Mat info is enabled again through PetscInfoActivateClass\n")); 1099566063dSJacob Faibussowitsch PetscCall(PetscInfoDeactivateClass(testMatClassid)); 1109566063dSJacob Faibussowitsch PetscCall(PetscInfoActivateClass(testVecClassid)); 1119566063dSJacob Faibussowitsch PetscCall(PetscInfo(b, "Vec info is enabled again through PetscInfoActivateClass\n")); 1129566063dSJacob Faibussowitsch PetscCall(PetscInfoDeactivateClass(testVecClassid)); 1139566063dSJacob Faibussowitsch PetscCall(PetscInfoActivateClass(testSysClassid)); 1149566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Sys info is enabled again through PetscInfoActivateClass\n")); 1159566063dSJacob Faibussowitsch PetscCall(PetscInfoDeactivateClass(testVecClassid)); 116c20d7725SJed Brown 117c20d7725SJed Brown /* 118c20d7725SJed Brown Activate PetscInfo() by specifying specific classnames to activate 119c20d7725SJed Brown */ 1209566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy("mat,vec,sys", &testClassesStr)); 1219566063dSJacob Faibussowitsch PetscCall(PetscStrToArray((const char *)testClassesStr, ',', &numClasses, &testClassesStrArr)); 122300f1712SStefano Zampini PetscCall(PetscInfoSetClasses(invert, numClasses, (const char *const *)testClassesStrArr)); 1239566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass(testMatClassname, 1, &testMatClassid)); 1249566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass(testVecClassname, 1, &testVecClassid)); 1259566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass("sys", 1, &testSysClassid)); 126c20d7725SJed Brown 1279566063dSJacob Faibussowitsch PetscCall(PetscInfo(A, "Mat info is enabled again through PetscInfoSetClasses\n")); 1289566063dSJacob Faibussowitsch PetscCall(PetscInfo(b, "Vec info is enabled again through PetscInfoSetClasses\n")); 1299566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Sys info is enabled again through PetscInfoSetClasses\n")); 130c20d7725SJed Brown 1319566063dSJacob Faibussowitsch PetscCall(PetscStrToArrayDestroy(numClasses, testClassesStrArr)); 1329566063dSJacob Faibussowitsch PetscCall(PetscFree(testClassesStr)); 133c20d7725SJed Brown 134c20d7725SJed Brown /* 135c20d7725SJed Brown Activate PetscInfo() with an inverted filter selection. 136c20d7725SJed Brown - Inverting our selection of filters enables PetscInfo() for all classes EXCEPT those specified. 137c20d7725SJed Brown - Note we must reset PetscInfo() internal flags with PetscInfoDestroy() as invoking PetscInfoProcessClass() locks filters in place. 138c20d7725SJed Brown */ 1399566063dSJacob Faibussowitsch PetscCall(PetscInfoDestroy()); 1409566063dSJacob Faibussowitsch PetscCall(PetscInfoAllow(PETSC_TRUE)); 1419566063dSJacob Faibussowitsch PetscCall(PetscInfoSetFile(filename, "a")); 1429566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy("vec,sys", &testClassesStr)); 1439566063dSJacob Faibussowitsch PetscCall(PetscStrToArray((const char *)testClassesStr, ',', &numClasses, &testClassesStrArr)); 144c20d7725SJed Brown invert = PETSC_TRUE; 145300f1712SStefano Zampini PetscCall(PetscInfoSetClasses(invert, numClasses, (const char *const *)testClassesStrArr)); 1469566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass(testMatClassname, 1, &testMatClassid)); 1479566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass(testVecClassname, 1, &testVecClassid)); 1489566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass("sys", 1, &testSysClassid)); 149c20d7725SJed Brown 150c20d7725SJed Brown /* 151c20d7725SJed Brown Here only the Mat() call will successfully print. 152c20d7725SJed Brown */ 1539566063dSJacob Faibussowitsch PetscCall(PetscInfo(A, "Mat info is enabled again through inverted PetscInfoSetClasses\n")); 1549566063dSJacob Faibussowitsch PetscCall(PetscInfo(b, "Vec info is enabled again through PetscInfoSetClasses\n")); 1559566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Sys info is enabled again through PetscInfoSetClasses\n")); 156c20d7725SJed Brown 1579566063dSJacob Faibussowitsch PetscCall(PetscStrToArrayDestroy(numClasses, testClassesStrArr)); 1589566063dSJacob Faibussowitsch PetscCall(PetscFree(testClassesStr)); 1599566063dSJacob Faibussowitsch PetscCall(PetscFree(filename)); 1609566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 1619566063dSJacob Faibussowitsch PetscCall(VecDestroy(&b)); 1629566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 163b122ec5aSJacob Faibussowitsch return 0; 164c20d7725SJed Brown } 165c20d7725SJed Brown 166c20d7725SJed Brown /*TEST 167c20d7725SJed Brown 168c20d7725SJed Brown test: 1696c2b77d5SStefano Zampini requires: defined(PETSC_USE_INFO) !defined(PETSC_HAVE_THREADSAFETY) 170c20d7725SJed Brown suffix: 1 171c20d7725SJed Brown args: -info 172*54606e8bSsdargavi filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscSetFPTrap -ve PetscDetermineInitialFPTrap -ve libpetscbamg -ve libpetscpflare -ve PetscDeviceContext -ve PetscDeviceType -ve BLAS -ve PetscDeviceInitializeTypeFromOptions_Private 173c20d7725SJed Brown 174c20d7725SJed Brown test: 1756c2b77d5SStefano Zampini requires: defined(PETSC_USE_INFO) !defined(PETSC_HAVE_THREADSAFETY) 176c20d7725SJed Brown suffix: 2 177cc9df77eSBarry Smith args: -info ex7info.2 178*54606e8bSsdargavi filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscSetFPTrap -ve PetscDetermineInitialFPTrap -ve libpetscbamg -ve libpetscpflare -ve PetscDeviceContext -ve PetscDeviceType -ve BLAS -ve PetscDeviceInitializeTypeFromOptions_Private "ex7info.2.0" 179c20d7725SJed Brown 180c20d7725SJed Brown test: 1816c2b77d5SStefano Zampini requires: defined(PETSC_USE_INFO) !defined(PETSC_HAVE_THREADSAFETY) 182c20d7725SJed Brown suffix: 3 183c20d7725SJed Brown nsize: 2 184cc9df77eSBarry Smith args: -info ex7info.3 185*54606e8bSsdargavi filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscSetFPTrap -ve PetscDetermineInitialFPTrap -ve libpetscbamg -ve libpetscpflare -ve PetscDeviceContext -ve PetscDeviceType -ve BLAS -ve PetscDeviceInitializeTypeFromOptions_Private "ex7info.3.0" | sort -b 186c20d7725SJed Brown 187c20d7725SJed Brown test: 188dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 189c20d7725SJed Brown suffix: 4 190c20d7725SJed Brown args: -info :mat,vec: 1913872ee93SStefano Zampini filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscSetFPTrap -ve PetscDetermineInitialFPTrap 192c20d7725SJed Brown 193c20d7725SJed Brown test: 194dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 195c20d7725SJed Brown suffix: 5 196c20d7725SJed Brown args: -info :~sys: 1973872ee93SStefano Zampini filter: grep -h -ve PetscSetFPTrap -ve PetscDetermineInitialFPTrap 198c20d7725SJed Brown 199c20d7725SJed Brown test: 200dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 201c20d7725SJed Brown suffix: 6 202c20d7725SJed Brown nsize: 2 203cc9df77eSBarry Smith args: -info ex7info.6:mat:self 204cc9df77eSBarry Smith filter: grep -h "ex7info.6.0" | sort -b 2053886731fSPierre Jolivet output_file: output/empty.out 206c20d7725SJed Brown 207c20d7725SJed Brown test: 208dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 209c20d7725SJed Brown suffix: 7 210c20d7725SJed Brown nsize: 2 211cc9df77eSBarry Smith args: -info ex7info.7:mat:~self 212cc9df77eSBarry Smith filter: grep -h "ex7info.7.0" | sort -b 2133886731fSPierre Jolivet output_file: output/empty.out 214c20d7725SJed Brown 215c20d7725SJed Brown TEST*/ 216