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