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