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