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