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