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