1c20d7725SJed Brown static char help[] = "Example use of PetscInfo() as a configurable informative logging or warning tool\n"; 2c20d7725SJed Brown 3c20d7725SJed Brown /*T 4c20d7725SJed Brown Concepts: introduction to logging techniques and introspection in PETSc; 5c20d7725SJed Brown Processors: n 6c20d7725SJed Brown T*/ 7c20d7725SJed Brown 8c20d7725SJed Brown # include <petscsys.h> 9c20d7725SJed Brown # include <petscmat.h> 10c20d7725SJed Brown # include <petscvec.h> 11c20d7725SJed Brown 12c20d7725SJed Brown int main(int argc, char **argv) 13c20d7725SJed Brown { 14c20d7725SJed Brown Mat A, Aself; 15c20d7725SJed Brown Vec b, bself; 16956f8c0dSBarry Smith #if defined(PETSC_USE_INFO) 17c20d7725SJed Brown PetscInt testarg = 1234; 18956f8c0dSBarry Smith #endif 19c20d7725SJed Brown int numClasses; 20c20d7725SJed Brown PetscClassId testMatClassid, testVecClassid, testSysClassid; 21c20d7725SJed Brown PetscBool isEnabled = PETSC_FALSE, invert = PETSC_FALSE; 22c20d7725SJed Brown char *testClassesStr, *filename; 23c20d7725SJed Brown const char *testMatClassname, *testVecClassname; 24c20d7725SJed Brown char **testClassesStrArr; 25c20d7725SJed Brown FILE *infoFile; 26c20d7725SJed Brown 27*b122ec5aSJacob Faibussowitsch CHKERRQ(PetscInitialize(&argc, &argv,(char *) 0, help)); 28c20d7725SJed Brown 29c20d7725SJed Brown /* 30c20d7725SJed Brown Examples on how to call PetscInfo() using different objects with or without arguments, and different communicators. 31c20d7725SJed Brown - Until PetscInfoDestroy() is called all PetscInfo() behaviour is goverened by command line options, which 32c20d7725SJed Brown are processed during PetscInitialize(). 33c20d7725SJed Brown */ 345f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreate(PETSC_COMM_WORLD, &A)); 355f80ce2aSJacob Faibussowitsch CHKERRQ(VecCreate(PETSC_COMM_WORLD, &b)); 36c20d7725SJed Brown 375f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(A, "Mat info on PETSC_COMM_WORLD with no arguments\n")); 385f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(A, "Mat info on PETSC_COMM_WORLD with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 395f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(b, "Vec info on PETSC_COMM_WORLD with no arguments\n")); 405f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(b, "Vec info on PETSC_COMM_WORLD with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 415f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(NULL, "Sys info on PETSC_COMM_WORLD with no arguments\n")); 425f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(NULL, "Sys info on PETSC_COMM_WORLD with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 43c20d7725SJed Brown 445f80ce2aSJacob Faibussowitsch CHKERRQ(MatCreate(PETSC_COMM_SELF, &Aself)); 455f80ce2aSJacob Faibussowitsch CHKERRQ(VecCreate(PETSC_COMM_SELF, &bself)); 46c20d7725SJed Brown 475f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(Aself, "Mat info on PETSC_COMM_SELF with no arguments\n")); 485f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(Aself, "Mat info on PETSC_COMM_SELF with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 495f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(bself, "Vec info on PETSC_COMM_SELF with no arguments\n")); 505f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(bself, "Vec info on PETSC_COMM_SELF with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 515f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(NULL, "Sys info on PETSC_COMM_SELF with no arguments\n")); 525f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(NULL, "Sys info on PETSC_COMM_SELF with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg)); 53c20d7725SJed Brown 545f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&Aself)); 555f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&bself)); 56c20d7725SJed Brown /* 57c20d7725SJed Brown First retrieve some basic information regarding the classes for which we want to filter 58c20d7725SJed Brown */ 595f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectGetClassId((PetscObject) A, &testMatClassid)); 605f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectGetClassId((PetscObject) b, &testVecClassid)); 61c20d7725SJed Brown /* Sys class has PetscClassId = PETSC_SMALLEST_CLASSID */ 62c20d7725SJed Brown testSysClassid = PETSC_SMALLEST_CLASSID; 635f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectGetClassName((PetscObject) A, &testMatClassname)); 645f80ce2aSJacob Faibussowitsch CHKERRQ(PetscObjectGetClassName((PetscObject) b, &testVecClassname)); 65c20d7725SJed Brown 66c20d7725SJed Brown /* 67c20d7725SJed Brown Examples on how to use individual PetscInfo() commands. 68c20d7725SJed Brown */ 695f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoEnabled(testMatClassid, &isEnabled)); 705f80ce2aSJacob Faibussowitsch if (isEnabled) CHKERRQ(PetscInfo(A, "Mat info is enabled\n")); 715f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoEnabled(testVecClassid, &isEnabled)); 725f80ce2aSJacob Faibussowitsch if (isEnabled) CHKERRQ(PetscInfo(b, "Vec info is enabled\n")); 735f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoEnabled(testSysClassid, &isEnabled)); 745f80ce2aSJacob Faibussowitsch if (isEnabled) CHKERRQ(PetscInfo(NULL, "Sys info is enabled\n")); 75c20d7725SJed Brown 76c20d7725SJed Brown /* Retrieve filename to append later entries to */ 775f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoGetFile(&filename, &infoFile)); 78c20d7725SJed Brown 79c20d7725SJed Brown /* 80c20d7725SJed Brown Destroy existing PetscInfo() configuration and reset all internal flags to default values. This allows the user to change filters 81c20d7725SJed Brown midway through a program. 82c20d7725SJed Brown */ 835f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoDestroy()); 84c20d7725SJed Brown 85c20d7725SJed Brown /* 86c20d7725SJed Brown Test if existing filters are reset. 87c20d7725SJed Brown - Note these should NEVER print. 88c20d7725SJed Brown */ 895f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoEnabled(testMatClassid, &isEnabled)); 905f80ce2aSJacob Faibussowitsch if (isEnabled) CHKERRQ(PetscInfo(A, "Mat info is enabled after PetscInfoDestroy\n")); 915f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoEnabled(testVecClassid, &isEnabled)); 925f80ce2aSJacob Faibussowitsch if (isEnabled) CHKERRQ(PetscInfo(b, "Vec info is enabled after PetscInfoDestroy\n")); 935f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoEnabled(testSysClassid, &isEnabled)); 945f80ce2aSJacob Faibussowitsch if (isEnabled) CHKERRQ(PetscInfo(NULL, "Sys info is enabled after PetscInfoDestroy\n")); 95c20d7725SJed Brown 96c20d7725SJed Brown /* 97c20d7725SJed Brown Reactivate PetscInfo() printing in one of two ways. 98c20d7725SJed Brown - First we must reactivate PetscInfo() printing as a whole. 99c20d7725SJed Brown - Keep in mind that by default ALL classes are allowed to print if PetscInfo() is enabled, so we deactivate 100c20d7725SJed Brown relevant classes first to demonstrate activation functionality. 101c20d7725SJed Brown */ 1025f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoAllow(PETSC_TRUE)); 1035f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoSetFile(filename, "a")); 1045f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoDeactivateClass(testMatClassid)); 1055f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoDeactivateClass(testVecClassid)); 1065f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoDeactivateClass(testSysClassid)); 107c20d7725SJed Brown 108c20d7725SJed Brown /* 109c20d7725SJed Brown Activate PetscInfo() on a per-class basis 110c20d7725SJed Brown */ 1115f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoActivateClass(testMatClassid)); 1125f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(A, "Mat info is enabled again through PetscInfoActivateClass\n")); 1135f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoDeactivateClass(testMatClassid)); 1145f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoActivateClass(testVecClassid)); 1155f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(b, "Vec info is enabled again through PetscInfoActivateClass\n")); 1165f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoDeactivateClass(testVecClassid)); 1175f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoActivateClass(testSysClassid)); 1185f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(NULL, "Sys info is enabled again through PetscInfoActivateClass\n")); 1195f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoDeactivateClass(testVecClassid)); 120c20d7725SJed Brown 121c20d7725SJed Brown /* 122c20d7725SJed Brown Activate PetscInfo() by specifying specific classnames to activate 123c20d7725SJed Brown */ 1245f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrallocpy("mat,vec,sys", &testClassesStr)); 1255f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrToArray((const char *)testClassesStr, ',', &numClasses, &testClassesStrArr)); 1265f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoSetClasses(invert, (PetscInt) numClasses, (const char *const *) testClassesStrArr)); 1275f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoProcessClass(testMatClassname, 1, &testMatClassid)); 1285f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoProcessClass(testVecClassname, 1, &testVecClassid)); 1295f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoProcessClass("sys", 1, &testSysClassid)); 130c20d7725SJed Brown 1315f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(A, "Mat info is enabled again through PetscInfoSetClasses\n")); 1325f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(b, "Vec info is enabled again through PetscInfoSetClasses\n")); 1335f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(NULL, "Sys info is enabled again through PetscInfoSetClasses\n")); 134c20d7725SJed Brown 1355f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrToArrayDestroy(numClasses, testClassesStrArr)); 1365f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(testClassesStr)); 137c20d7725SJed Brown 138c20d7725SJed Brown /* 139c20d7725SJed Brown Activate PetscInfo() with an inverted filter selection. 140c20d7725SJed Brown - Inverting our selection of filters enables PetscInfo() for all classes EXCEPT those specified. 141c20d7725SJed Brown - Note we must reset PetscInfo() internal flags with PetscInfoDestroy() as invoking PetscInfoProcessClass() locks filters in place. 142c20d7725SJed Brown */ 1435f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoDestroy()); 1445f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoAllow(PETSC_TRUE)); 1455f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoSetFile(filename, "a")); 1465f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrallocpy("vec,sys", &testClassesStr)); 1475f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrToArray((const char *)testClassesStr, ',', &numClasses, &testClassesStrArr)); 148c20d7725SJed Brown invert = PETSC_TRUE; 1495f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoSetClasses(invert, (PetscInt) numClasses, (const char *const *) testClassesStrArr)); 1505f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoProcessClass(testMatClassname, 1, &testMatClassid)); 1515f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoProcessClass(testVecClassname, 1, &testVecClassid)); 1525f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfoProcessClass("sys", 1, &testSysClassid)); 153c20d7725SJed Brown 154c20d7725SJed Brown /* 155c20d7725SJed Brown Here only the Mat() call will successfully print. 156c20d7725SJed Brown */ 1575f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(A, "Mat info is enabled again through inverted PetscInfoSetClasses\n")); 1585f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(b, "Vec info is enabled again through PetscInfoSetClasses\n")); 1595f80ce2aSJacob Faibussowitsch CHKERRQ(PetscInfo(NULL, "Sys info is enabled again through PetscInfoSetClasses\n")); 160c20d7725SJed Brown 1615f80ce2aSJacob Faibussowitsch CHKERRQ(PetscStrToArrayDestroy(numClasses, testClassesStrArr)); 1625f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(testClassesStr)); 1635f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFree(filename)); 1645f80ce2aSJacob Faibussowitsch CHKERRQ(MatDestroy(&A)); 1655f80ce2aSJacob Faibussowitsch CHKERRQ(VecDestroy(&b)); 1665f80ce2aSJacob Faibussowitsch CHKERRQ(PetscFinalize()); 167*b122ec5aSJacob Faibussowitsch return 0; 168c20d7725SJed Brown } 169c20d7725SJed Brown 170c20d7725SJed Brown /*TEST 171c20d7725SJed Brown 172c20d7725SJed Brown test: 173dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 174c20d7725SJed Brown suffix: 1 175c20d7725SJed Brown args: -info 176a4af0ceeSJacob Faibussowitsch filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscDetermineInitialFPTrap -ve libpetscbamg -ve PetscDeviceContext -ve PetscDeviceType 177c20d7725SJed Brown 178c20d7725SJed Brown test: 179dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 180c20d7725SJed Brown suffix: 2 181cc9df77eSBarry Smith args: -info ex7info.2 182a4af0ceeSJacob Faibussowitsch filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscDetermineInitialFPTrap -ve libpetscbamg -ve PetscDeviceContext -ve PetscDeviceType "ex7info.2.0" 183c20d7725SJed Brown 184c20d7725SJed Brown test: 185dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 186c20d7725SJed Brown suffix: 3 187c20d7725SJed Brown nsize: 2 188cc9df77eSBarry Smith args: -info ex7info.3 189a4af0ceeSJacob Faibussowitsch filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscDetermineInitialFPTrap -ve libpetscbamg -ve PetscDeviceContext -ve PetscDeviceType "ex7info.3.0" | sort -b 190c20d7725SJed Brown 191c20d7725SJed Brown test: 192dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 193c20d7725SJed Brown suffix: 4 194c20d7725SJed Brown args: -info :mat,vec: 195aba4c478SBarry Smith filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscDetermineInitialFPTrap 196c20d7725SJed Brown 197c20d7725SJed Brown test: 198dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 199c20d7725SJed Brown suffix: 5 200c20d7725SJed Brown args: -info :~sys: 201aba4c478SBarry Smith filter: grep -h -ve PetscDetermineInitialFPTrap 202c20d7725SJed Brown 203c20d7725SJed Brown test: 204dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 205c20d7725SJed Brown suffix: 6 206c20d7725SJed Brown nsize: 2 207cc9df77eSBarry Smith args: -info ex7info.6:mat:self 208cc9df77eSBarry Smith filter: grep -h "ex7info.6.0" | sort -b 209c20d7725SJed Brown 210c20d7725SJed Brown test: 211dfd57a17SPierre Jolivet requires: defined(PETSC_USE_INFO) 212c20d7725SJed Brown suffix: 7 213c20d7725SJed Brown nsize: 2 214cc9df77eSBarry Smith args: -info ex7info.7:mat:~self 215cc9df77eSBarry Smith filter: grep -h "ex7info.7.0" | sort -b 216c20d7725SJed Brown 217c20d7725SJed Brown TEST*/ 218