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