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