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