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 79371c9d4SSatish Balay int main(int argc, char **argv) { 8c20d7725SJed Brown Mat A, Aself; 9c20d7725SJed Brown Vec b, bself; 10956f8c0dSBarry Smith #if defined(PETSC_USE_INFO) 11c20d7725SJed Brown PetscInt testarg = 1234; 12956f8c0dSBarry Smith #endif 13c20d7725SJed Brown int numClasses; 14c20d7725SJed Brown PetscClassId testMatClassid, testVecClassid, testSysClassid; 15c20d7725SJed Brown PetscBool isEnabled = PETSC_FALSE, invert = PETSC_FALSE; 16c20d7725SJed Brown char *testClassesStr, *filename; 17c20d7725SJed Brown const char *testMatClassname, *testVecClassname; 18c20d7725SJed Brown char **testClassesStrArr; 19c20d7725SJed Brown FILE *infoFile; 20c20d7725SJed Brown 21327415f7SBarry Smith PetscFunctionBeginUser; 229566063dSJacob Faibussowitsch PetscCall(PetscInitialize(&argc, &argv, (char *)0, help)); 23c20d7725SJed Brown 24c20d7725SJed Brown /* 25c20d7725SJed Brown Examples on how to call PetscInfo() using different objects with or without arguments, and different communicators. 26c20d7725SJed Brown - Until PetscInfoDestroy() is called all PetscInfo() behaviour is goverened by command line options, which 27c20d7725SJed Brown are processed during PetscInitialize(). 28c20d7725SJed Brown */ 299566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_WORLD, &A)); 309566063dSJacob Faibussowitsch PetscCall(VecCreate(PETSC_COMM_WORLD, &b)); 31c20d7725SJed Brown 329566063dSJacob Faibussowitsch PetscCall(PetscInfo(A, "Mat info on PETSC_COMM_WORLD with no arguments\n")); 339566063dSJacob Faibussowitsch PetscCall(PetscInfo(A, "Mat info on PETSC_COMM_WORLD with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 349566063dSJacob Faibussowitsch PetscCall(PetscInfo(b, "Vec info on PETSC_COMM_WORLD with no arguments\n")); 359566063dSJacob Faibussowitsch PetscCall(PetscInfo(b, "Vec info on PETSC_COMM_WORLD with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 369566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Sys info on PETSC_COMM_WORLD with no arguments\n")); 379566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Sys info on PETSC_COMM_WORLD with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 38c20d7725SJed Brown 399566063dSJacob Faibussowitsch PetscCall(MatCreate(PETSC_COMM_SELF, &Aself)); 409566063dSJacob Faibussowitsch PetscCall(VecCreate(PETSC_COMM_SELF, &bself)); 41c20d7725SJed Brown 429566063dSJacob Faibussowitsch PetscCall(PetscInfo(Aself, "Mat info on PETSC_COMM_SELF with no arguments\n")); 439566063dSJacob Faibussowitsch PetscCall(PetscInfo(Aself, "Mat info on PETSC_COMM_SELF with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 449566063dSJacob Faibussowitsch PetscCall(PetscInfo(bself, "Vec info on PETSC_COMM_SELF with no arguments\n")); 459566063dSJacob Faibussowitsch PetscCall(PetscInfo(bself, "Vec info on PETSC_COMM_SELF with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 469566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Sys info on PETSC_COMM_SELF with no arguments\n")); 479566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Sys info on PETSC_COMM_SELF with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 48c20d7725SJed Brown 499566063dSJacob Faibussowitsch PetscCall(MatDestroy(&Aself)); 509566063dSJacob Faibussowitsch PetscCall(VecDestroy(&bself)); 51c20d7725SJed Brown /* 52c20d7725SJed Brown First retrieve some basic information regarding the classes for which we want to filter 53c20d7725SJed Brown */ 549566063dSJacob Faibussowitsch PetscCall(PetscObjectGetClassId((PetscObject)A, &testMatClassid)); 559566063dSJacob Faibussowitsch PetscCall(PetscObjectGetClassId((PetscObject)b, &testVecClassid)); 56c20d7725SJed Brown /* Sys class has PetscClassId = PETSC_SMALLEST_CLASSID */ 57c20d7725SJed Brown testSysClassid = PETSC_SMALLEST_CLASSID; 589566063dSJacob Faibussowitsch PetscCall(PetscObjectGetClassName((PetscObject)A, &testMatClassname)); 599566063dSJacob Faibussowitsch PetscCall(PetscObjectGetClassName((PetscObject)b, &testVecClassname)); 60c20d7725SJed Brown 61c20d7725SJed Brown /* 62c20d7725SJed Brown Examples on how to use individual PetscInfo() commands. 63c20d7725SJed Brown */ 649566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(testMatClassid, &isEnabled)); 659566063dSJacob Faibussowitsch if (isEnabled) PetscCall(PetscInfo(A, "Mat info is enabled\n")); 669566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(testVecClassid, &isEnabled)); 679566063dSJacob Faibussowitsch if (isEnabled) PetscCall(PetscInfo(b, "Vec info is enabled\n")); 689566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(testSysClassid, &isEnabled)); 699566063dSJacob Faibussowitsch if (isEnabled) PetscCall(PetscInfo(NULL, "Sys info is enabled\n")); 70c20d7725SJed Brown 71c20d7725SJed Brown /* Retrieve filename to append later entries to */ 729566063dSJacob Faibussowitsch PetscCall(PetscInfoGetFile(&filename, &infoFile)); 73c20d7725SJed Brown 74c20d7725SJed Brown /* 75c20d7725SJed Brown Destroy existing PetscInfo() configuration and reset all internal flags to default values. This allows the user to change filters 76c20d7725SJed Brown midway through a program. 77c20d7725SJed Brown */ 789566063dSJacob Faibussowitsch PetscCall(PetscInfoDestroy()); 79c20d7725SJed Brown 80c20d7725SJed Brown /* 81c20d7725SJed Brown Test if existing filters are reset. 82c20d7725SJed Brown - Note these should NEVER print. 83c20d7725SJed Brown */ 849566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(testMatClassid, &isEnabled)); 859566063dSJacob Faibussowitsch if (isEnabled) PetscCall(PetscInfo(A, "Mat info is enabled after PetscInfoDestroy\n")); 869566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(testVecClassid, &isEnabled)); 879566063dSJacob Faibussowitsch if (isEnabled) PetscCall(PetscInfo(b, "Vec info is enabled after PetscInfoDestroy\n")); 889566063dSJacob Faibussowitsch PetscCall(PetscInfoEnabled(testSysClassid, &isEnabled)); 899566063dSJacob Faibussowitsch if (isEnabled) PetscCall(PetscInfo(NULL, "Sys info is enabled after PetscInfoDestroy\n")); 90c20d7725SJed Brown 91c20d7725SJed Brown /* 92c20d7725SJed Brown Reactivate PetscInfo() printing in one of two ways. 93c20d7725SJed Brown - First we must reactivate PetscInfo() printing as a whole. 94c20d7725SJed Brown - Keep in mind that by default ALL classes are allowed to print if PetscInfo() is enabled, so we deactivate 95c20d7725SJed Brown relevant classes first to demonstrate activation functionality. 96c20d7725SJed Brown */ 979566063dSJacob Faibussowitsch PetscCall(PetscInfoAllow(PETSC_TRUE)); 989566063dSJacob Faibussowitsch PetscCall(PetscInfoSetFile(filename, "a")); 999566063dSJacob Faibussowitsch PetscCall(PetscInfoDeactivateClass(testMatClassid)); 1009566063dSJacob Faibussowitsch PetscCall(PetscInfoDeactivateClass(testVecClassid)); 1019566063dSJacob Faibussowitsch PetscCall(PetscInfoDeactivateClass(testSysClassid)); 102c20d7725SJed Brown 103c20d7725SJed Brown /* 104c20d7725SJed Brown Activate PetscInfo() on a per-class basis 105c20d7725SJed Brown */ 1069566063dSJacob Faibussowitsch PetscCall(PetscInfoActivateClass(testMatClassid)); 1079566063dSJacob Faibussowitsch PetscCall(PetscInfo(A, "Mat info is enabled again through PetscInfoActivateClass\n")); 1089566063dSJacob Faibussowitsch PetscCall(PetscInfoDeactivateClass(testMatClassid)); 1099566063dSJacob Faibussowitsch PetscCall(PetscInfoActivateClass(testVecClassid)); 1109566063dSJacob Faibussowitsch PetscCall(PetscInfo(b, "Vec info is enabled again through PetscInfoActivateClass\n")); 1119566063dSJacob Faibussowitsch PetscCall(PetscInfoDeactivateClass(testVecClassid)); 1129566063dSJacob Faibussowitsch PetscCall(PetscInfoActivateClass(testSysClassid)); 1139566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Sys info is enabled again through PetscInfoActivateClass\n")); 1149566063dSJacob Faibussowitsch PetscCall(PetscInfoDeactivateClass(testVecClassid)); 115c20d7725SJed Brown 116c20d7725SJed Brown /* 117c20d7725SJed Brown Activate PetscInfo() by specifying specific classnames to activate 118c20d7725SJed Brown */ 1199566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy("mat,vec,sys", &testClassesStr)); 1209566063dSJacob Faibussowitsch PetscCall(PetscStrToArray((const char *)testClassesStr, ',', &numClasses, &testClassesStrArr)); 1219566063dSJacob Faibussowitsch PetscCall(PetscInfoSetClasses(invert, (PetscInt)numClasses, (const char *const *)testClassesStrArr)); 1229566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass(testMatClassname, 1, &testMatClassid)); 1239566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass(testVecClassname, 1, &testVecClassid)); 1249566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass("sys", 1, &testSysClassid)); 125c20d7725SJed Brown 1269566063dSJacob Faibussowitsch PetscCall(PetscInfo(A, "Mat info is enabled again through PetscInfoSetClasses\n")); 1279566063dSJacob Faibussowitsch PetscCall(PetscInfo(b, "Vec info is enabled again through PetscInfoSetClasses\n")); 1289566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Sys info is enabled again through PetscInfoSetClasses\n")); 129c20d7725SJed Brown 1309566063dSJacob Faibussowitsch PetscCall(PetscStrToArrayDestroy(numClasses, testClassesStrArr)); 1319566063dSJacob Faibussowitsch PetscCall(PetscFree(testClassesStr)); 132c20d7725SJed Brown 133c20d7725SJed Brown /* 134c20d7725SJed Brown Activate PetscInfo() with an inverted filter selection. 135c20d7725SJed Brown - Inverting our selection of filters enables PetscInfo() for all classes EXCEPT those specified. 136c20d7725SJed Brown - Note we must reset PetscInfo() internal flags with PetscInfoDestroy() as invoking PetscInfoProcessClass() locks filters in place. 137c20d7725SJed Brown */ 1389566063dSJacob Faibussowitsch PetscCall(PetscInfoDestroy()); 1399566063dSJacob Faibussowitsch PetscCall(PetscInfoAllow(PETSC_TRUE)); 1409566063dSJacob Faibussowitsch PetscCall(PetscInfoSetFile(filename, "a")); 1419566063dSJacob Faibussowitsch PetscCall(PetscStrallocpy("vec,sys", &testClassesStr)); 1429566063dSJacob Faibussowitsch PetscCall(PetscStrToArray((const char *)testClassesStr, ',', &numClasses, &testClassesStrArr)); 143c20d7725SJed Brown invert = PETSC_TRUE; 1449566063dSJacob Faibussowitsch PetscCall(PetscInfoSetClasses(invert, (PetscInt)numClasses, (const char *const *)testClassesStrArr)); 1459566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass(testMatClassname, 1, &testMatClassid)); 1469566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass(testVecClassname, 1, &testVecClassid)); 1479566063dSJacob Faibussowitsch PetscCall(PetscInfoProcessClass("sys", 1, &testSysClassid)); 148c20d7725SJed Brown 149c20d7725SJed Brown /* 150c20d7725SJed Brown Here only the Mat() call will successfully print. 151c20d7725SJed Brown */ 1529566063dSJacob Faibussowitsch PetscCall(PetscInfo(A, "Mat info is enabled again through inverted PetscInfoSetClasses\n")); 1539566063dSJacob Faibussowitsch PetscCall(PetscInfo(b, "Vec info is enabled again through PetscInfoSetClasses\n")); 1549566063dSJacob Faibussowitsch PetscCall(PetscInfo(NULL, "Sys info is enabled again through PetscInfoSetClasses\n")); 155c20d7725SJed Brown 1569566063dSJacob Faibussowitsch PetscCall(PetscStrToArrayDestroy(numClasses, testClassesStrArr)); 1579566063dSJacob Faibussowitsch PetscCall(PetscFree(testClassesStr)); 1589566063dSJacob Faibussowitsch PetscCall(PetscFree(filename)); 1599566063dSJacob Faibussowitsch PetscCall(MatDestroy(&A)); 1609566063dSJacob Faibussowitsch PetscCall(VecDestroy(&b)); 1619566063dSJacob Faibussowitsch PetscCall(PetscFinalize()); 162b122ec5aSJacob Faibussowitsch return 0; 163c20d7725SJed Brown } 164c20d7725SJed Brown 165c20d7725SJed Brown /*TEST 166c20d7725SJed Brown 167c20d7725SJed Brown test: 168dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 169c20d7725SJed Brown suffix: 1 170c20d7725SJed Brown args: -info 171*0e6b6b59SJacob Faibussowitsch filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscDetermineInitialFPTrap -ve libpetscbamg -ve PetscDeviceContext -ve PetscDeviceType -ve PetscDeviceInitializeTypeFromOptions_Private 172c20d7725SJed Brown 173c20d7725SJed Brown test: 174dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 175c20d7725SJed Brown suffix: 2 176cc9df77eSBarry Smith args: -info ex7info.2 177*0e6b6b59SJacob Faibussowitsch filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscDetermineInitialFPTrap -ve libpetscbamg -ve PetscDeviceContext -ve PetscDeviceType -ve PetscDeviceInitializeTypeFromOptions_Private "ex7info.2.0" 178c20d7725SJed Brown 179c20d7725SJed Brown test: 180dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 181c20d7725SJed Brown suffix: 3 182c20d7725SJed Brown nsize: 2 183cc9df77eSBarry Smith args: -info ex7info.3 184*0e6b6b59SJacob Faibussowitsch filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscDetermineInitialFPTrap -ve libpetscbamg -ve PetscDeviceContext -ve PetscDeviceType -ve PetscDeviceInitializeTypeFromOptions_Private "ex7info.3.0" | sort -b 185c20d7725SJed Brown 186c20d7725SJed Brown test: 187dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 188c20d7725SJed Brown suffix: 4 189c20d7725SJed Brown args: -info :mat,vec: 190aba4c478SBarry Smith filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscDetermineInitialFPTrap 191c20d7725SJed Brown 192c20d7725SJed Brown test: 193dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 194c20d7725SJed Brown suffix: 5 195c20d7725SJed Brown args: -info :~sys: 196aba4c478SBarry Smith filter: grep -h -ve PetscDetermineInitialFPTrap 197c20d7725SJed Brown 198c20d7725SJed Brown test: 199dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 200c20d7725SJed Brown suffix: 6 201c20d7725SJed Brown nsize: 2 202cc9df77eSBarry Smith args: -info ex7info.6:mat:self 203cc9df77eSBarry Smith filter: grep -h "ex7info.6.0" | sort -b 204c20d7725SJed Brown 205c20d7725SJed Brown test: 206dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 207c20d7725SJed Brown suffix: 7 208c20d7725SJed Brown nsize: 2 209cc9df77eSBarry Smith args: -info ex7info.7:mat:~self 210cc9df77eSBarry Smith filter: grep -h "ex7info.7.0" | sort -b 211c20d7725SJed Brown 212c20d7725SJed Brown TEST*/ 213