xref: /petsc/src/mat/tutorials/ex7.c (revision b122ec5aa1bd4469eb4e0673542fb7de3f411254)
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