xref: /petsc/src/mat/tutorials/ex7.c (revision 012c79f403d420e9d0d77bf7bae9feb1b717d6c8)
1c20d7725SJed Brown static char help[] = "Example use of PetscInfo() as a configurable informative logging or warning tool\n";
2c20d7725SJed Brown 
3c20d7725SJed Brown #include <petscsys.h>
4c20d7725SJed Brown #include <petscmat.h>
5c20d7725SJed Brown #include <petscvec.h>
6c20d7725SJed Brown 
main(int argc,char ** argv)7d71ae5a4SJacob Faibussowitsch int main(int argc, char **argv)
8d71ae5a4SJacob Faibussowitsch {
9c20d7725SJed Brown   Mat A, Aself;
10c20d7725SJed Brown   Vec b, bself;
11956f8c0dSBarry Smith #if defined(PETSC_USE_INFO)
12c20d7725SJed Brown   PetscInt testarg = 1234;
13956f8c0dSBarry Smith #endif
14c20d7725SJed Brown   int          numClasses;
15c20d7725SJed Brown   PetscClassId testMatClassid, testVecClassid, testSysClassid;
16c20d7725SJed Brown   PetscBool    isEnabled = PETSC_FALSE, invert = PETSC_FALSE;
17c20d7725SJed Brown   char        *testClassesStr, *filename;
18c20d7725SJed Brown   const char  *testMatClassname, *testVecClassname;
19c20d7725SJed Brown   char       **testClassesStrArr;
20c20d7725SJed Brown   FILE        *infoFile;
21c20d7725SJed Brown 
22327415f7SBarry Smith   PetscFunctionBeginUser;
23c8025a54SPierre Jolivet   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
24c20d7725SJed Brown 
25c20d7725SJed Brown   /*
26c20d7725SJed Brown      Examples on how to call PetscInfo() using different objects with or without arguments, and different communicators.
27c20d7725SJed Brown       - Until PetscInfoDestroy() is called all PetscInfo() behaviour is goverened by command line options, which
28c20d7725SJed Brown         are processed during PetscInitialize().
29c20d7725SJed Brown   */
309566063dSJacob Faibussowitsch   PetscCall(MatCreate(PETSC_COMM_WORLD, &A));
319566063dSJacob Faibussowitsch   PetscCall(VecCreate(PETSC_COMM_WORLD, &b));
32c20d7725SJed Brown 
339566063dSJacob Faibussowitsch   PetscCall(PetscInfo(A, "Mat info on PETSC_COMM_WORLD with no arguments\n"));
349566063dSJacob Faibussowitsch   PetscCall(PetscInfo(A, "Mat info on PETSC_COMM_WORLD with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg));
359566063dSJacob Faibussowitsch   PetscCall(PetscInfo(b, "Vec info on PETSC_COMM_WORLD with no arguments\n"));
369566063dSJacob Faibussowitsch   PetscCall(PetscInfo(b, "Vec info on PETSC_COMM_WORLD with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg));
379566063dSJacob Faibussowitsch   PetscCall(PetscInfo(NULL, "Sys info on PETSC_COMM_WORLD with no arguments\n"));
389566063dSJacob Faibussowitsch   PetscCall(PetscInfo(NULL, "Sys info on PETSC_COMM_WORLD with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg));
39c20d7725SJed Brown 
409566063dSJacob Faibussowitsch   PetscCall(MatCreate(PETSC_COMM_SELF, &Aself));
419566063dSJacob Faibussowitsch   PetscCall(VecCreate(PETSC_COMM_SELF, &bself));
42c20d7725SJed Brown 
439566063dSJacob Faibussowitsch   PetscCall(PetscInfo(Aself, "Mat info on PETSC_COMM_SELF with no arguments\n"));
449566063dSJacob Faibussowitsch   PetscCall(PetscInfo(Aself, "Mat info on PETSC_COMM_SELF with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg));
459566063dSJacob Faibussowitsch   PetscCall(PetscInfo(bself, "Vec info on PETSC_COMM_SELF with no arguments\n"));
469566063dSJacob Faibussowitsch   PetscCall(PetscInfo(bself, "Vec info on PETSC_COMM_SELF with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg));
479566063dSJacob Faibussowitsch   PetscCall(PetscInfo(NULL, "Sys info on PETSC_COMM_SELF with no arguments\n"));
489566063dSJacob Faibussowitsch   PetscCall(PetscInfo(NULL, "Sys info on PETSC_COMM_SELF with 1 argument equal to 1234: %" PetscInt_FMT "\n", testarg));
49c20d7725SJed Brown 
509566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&Aself));
519566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&bself));
52c20d7725SJed Brown   /*
53c20d7725SJed Brown      First retrieve some basic information regarding the classes for which we want to filter
54c20d7725SJed Brown   */
559566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetClassId((PetscObject)A, &testMatClassid));
569566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetClassId((PetscObject)b, &testVecClassid));
57c20d7725SJed Brown   /* Sys class has PetscClassId = PETSC_SMALLEST_CLASSID */
58c20d7725SJed Brown   testSysClassid = PETSC_SMALLEST_CLASSID;
599566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetClassName((PetscObject)A, &testMatClassname));
609566063dSJacob Faibussowitsch   PetscCall(PetscObjectGetClassName((PetscObject)b, &testVecClassname));
61c20d7725SJed Brown 
62c20d7725SJed Brown   /*
63c20d7725SJed Brown      Examples on how to use individual PetscInfo() commands.
64c20d7725SJed Brown   */
659566063dSJacob Faibussowitsch   PetscCall(PetscInfoEnabled(testMatClassid, &isEnabled));
669566063dSJacob Faibussowitsch   if (isEnabled) PetscCall(PetscInfo(A, "Mat info is enabled\n"));
679566063dSJacob Faibussowitsch   PetscCall(PetscInfoEnabled(testVecClassid, &isEnabled));
689566063dSJacob Faibussowitsch   if (isEnabled) PetscCall(PetscInfo(b, "Vec info is enabled\n"));
699566063dSJacob Faibussowitsch   PetscCall(PetscInfoEnabled(testSysClassid, &isEnabled));
709566063dSJacob Faibussowitsch   if (isEnabled) PetscCall(PetscInfo(NULL, "Sys info is enabled\n"));
71c20d7725SJed Brown 
72c20d7725SJed Brown   /* Retrieve filename to append later entries to */
739566063dSJacob Faibussowitsch   PetscCall(PetscInfoGetFile(&filename, &infoFile));
74c20d7725SJed Brown 
75c20d7725SJed Brown   /*
76c20d7725SJed Brown      Destroy existing PetscInfo() configuration and reset all internal flags to default values. This allows the user to change filters
77c20d7725SJed Brown      midway through a program.
78c20d7725SJed Brown   */
799566063dSJacob Faibussowitsch   PetscCall(PetscInfoDestroy());
80c20d7725SJed Brown 
81c20d7725SJed Brown   /*
82c20d7725SJed Brown      Test if existing filters are reset.
83c20d7725SJed Brown       - Note these should NEVER print.
84c20d7725SJed Brown   */
859566063dSJacob Faibussowitsch   PetscCall(PetscInfoEnabled(testMatClassid, &isEnabled));
869566063dSJacob Faibussowitsch   if (isEnabled) PetscCall(PetscInfo(A, "Mat info is enabled after PetscInfoDestroy\n"));
879566063dSJacob Faibussowitsch   PetscCall(PetscInfoEnabled(testVecClassid, &isEnabled));
889566063dSJacob Faibussowitsch   if (isEnabled) PetscCall(PetscInfo(b, "Vec info is enabled after PetscInfoDestroy\n"));
899566063dSJacob Faibussowitsch   PetscCall(PetscInfoEnabled(testSysClassid, &isEnabled));
909566063dSJacob Faibussowitsch   if (isEnabled) PetscCall(PetscInfo(NULL, "Sys info is enabled after PetscInfoDestroy\n"));
91c20d7725SJed Brown 
92c20d7725SJed Brown   /*
93c20d7725SJed Brown      Reactivate PetscInfo() printing in one of two ways.
94c20d7725SJed Brown       - First we must reactivate PetscInfo() printing as a whole.
95c20d7725SJed Brown       - Keep in mind that by default ALL classes are allowed to print if PetscInfo() is enabled, so we deactivate
96c20d7725SJed Brown         relevant classes first to demonstrate activation functionality.
97c20d7725SJed Brown   */
989566063dSJacob Faibussowitsch   PetscCall(PetscInfoAllow(PETSC_TRUE));
999566063dSJacob Faibussowitsch   PetscCall(PetscInfoSetFile(filename, "a"));
1009566063dSJacob Faibussowitsch   PetscCall(PetscInfoDeactivateClass(testMatClassid));
1019566063dSJacob Faibussowitsch   PetscCall(PetscInfoDeactivateClass(testVecClassid));
1029566063dSJacob Faibussowitsch   PetscCall(PetscInfoDeactivateClass(testSysClassid));
103c20d7725SJed Brown 
104c20d7725SJed Brown   /*
105c20d7725SJed Brown      Activate PetscInfo() on a per-class basis
106c20d7725SJed Brown   */
1079566063dSJacob Faibussowitsch   PetscCall(PetscInfoActivateClass(testMatClassid));
1089566063dSJacob Faibussowitsch   PetscCall(PetscInfo(A, "Mat info is enabled again through PetscInfoActivateClass\n"));
1099566063dSJacob Faibussowitsch   PetscCall(PetscInfoDeactivateClass(testMatClassid));
1109566063dSJacob Faibussowitsch   PetscCall(PetscInfoActivateClass(testVecClassid));
1119566063dSJacob Faibussowitsch   PetscCall(PetscInfo(b, "Vec info is enabled again through PetscInfoActivateClass\n"));
1129566063dSJacob Faibussowitsch   PetscCall(PetscInfoDeactivateClass(testVecClassid));
1139566063dSJacob Faibussowitsch   PetscCall(PetscInfoActivateClass(testSysClassid));
1149566063dSJacob Faibussowitsch   PetscCall(PetscInfo(NULL, "Sys info is enabled again through PetscInfoActivateClass\n"));
1159566063dSJacob Faibussowitsch   PetscCall(PetscInfoDeactivateClass(testVecClassid));
116c20d7725SJed Brown 
117c20d7725SJed Brown   /*
118c20d7725SJed Brown      Activate PetscInfo() by specifying specific classnames to activate
119c20d7725SJed Brown   */
1209566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy("mat,vec,sys", &testClassesStr));
1219566063dSJacob Faibussowitsch   PetscCall(PetscStrToArray((const char *)testClassesStr, ',', &numClasses, &testClassesStrArr));
122300f1712SStefano Zampini   PetscCall(PetscInfoSetClasses(invert, numClasses, (const char *const *)testClassesStrArr));
1239566063dSJacob Faibussowitsch   PetscCall(PetscInfoProcessClass(testMatClassname, 1, &testMatClassid));
1249566063dSJacob Faibussowitsch   PetscCall(PetscInfoProcessClass(testVecClassname, 1, &testVecClassid));
1259566063dSJacob Faibussowitsch   PetscCall(PetscInfoProcessClass("sys", 1, &testSysClassid));
126c20d7725SJed Brown 
1279566063dSJacob Faibussowitsch   PetscCall(PetscInfo(A, "Mat info is enabled again through PetscInfoSetClasses\n"));
1289566063dSJacob Faibussowitsch   PetscCall(PetscInfo(b, "Vec info is enabled again through PetscInfoSetClasses\n"));
1299566063dSJacob Faibussowitsch   PetscCall(PetscInfo(NULL, "Sys info is enabled again through PetscInfoSetClasses\n"));
130c20d7725SJed Brown 
1319566063dSJacob Faibussowitsch   PetscCall(PetscStrToArrayDestroy(numClasses, testClassesStrArr));
1329566063dSJacob Faibussowitsch   PetscCall(PetscFree(testClassesStr));
133c20d7725SJed Brown 
134c20d7725SJed Brown   /*
135c20d7725SJed Brown      Activate PetscInfo() with an inverted filter selection.
136c20d7725SJed Brown       - Inverting our selection of filters enables PetscInfo() for all classes EXCEPT those specified.
137c20d7725SJed Brown       - Note we must reset PetscInfo() internal flags with PetscInfoDestroy() as invoking PetscInfoProcessClass() locks filters in place.
138c20d7725SJed Brown   */
1399566063dSJacob Faibussowitsch   PetscCall(PetscInfoDestroy());
1409566063dSJacob Faibussowitsch   PetscCall(PetscInfoAllow(PETSC_TRUE));
1419566063dSJacob Faibussowitsch   PetscCall(PetscInfoSetFile(filename, "a"));
1429566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy("vec,sys", &testClassesStr));
1439566063dSJacob Faibussowitsch   PetscCall(PetscStrToArray((const char *)testClassesStr, ',', &numClasses, &testClassesStrArr));
144c20d7725SJed Brown   invert = PETSC_TRUE;
145300f1712SStefano Zampini   PetscCall(PetscInfoSetClasses(invert, numClasses, (const char *const *)testClassesStrArr));
1469566063dSJacob Faibussowitsch   PetscCall(PetscInfoProcessClass(testMatClassname, 1, &testMatClassid));
1479566063dSJacob Faibussowitsch   PetscCall(PetscInfoProcessClass(testVecClassname, 1, &testVecClassid));
1489566063dSJacob Faibussowitsch   PetscCall(PetscInfoProcessClass("sys", 1, &testSysClassid));
149c20d7725SJed Brown 
150c20d7725SJed Brown   /*
151c20d7725SJed Brown      Here only the Mat() call will successfully print.
152c20d7725SJed Brown   */
1539566063dSJacob Faibussowitsch   PetscCall(PetscInfo(A, "Mat info is enabled again through inverted PetscInfoSetClasses\n"));
1549566063dSJacob Faibussowitsch   PetscCall(PetscInfo(b, "Vec info is enabled again through PetscInfoSetClasses\n"));
1559566063dSJacob Faibussowitsch   PetscCall(PetscInfo(NULL, "Sys info is enabled again through PetscInfoSetClasses\n"));
156c20d7725SJed Brown 
1579566063dSJacob Faibussowitsch   PetscCall(PetscStrToArrayDestroy(numClasses, testClassesStrArr));
1589566063dSJacob Faibussowitsch   PetscCall(PetscFree(testClassesStr));
1599566063dSJacob Faibussowitsch   PetscCall(PetscFree(filename));
1609566063dSJacob Faibussowitsch   PetscCall(MatDestroy(&A));
1619566063dSJacob Faibussowitsch   PetscCall(VecDestroy(&b));
1629566063dSJacob Faibussowitsch   PetscCall(PetscFinalize());
163b122ec5aSJacob Faibussowitsch   return 0;
164c20d7725SJed Brown }
165c20d7725SJed Brown 
166c20d7725SJed Brown /*TEST
167c20d7725SJed Brown 
168c20d7725SJed Brown    test:
1696c2b77d5SStefano Zampini       requires: defined(PETSC_USE_INFO) !defined(PETSC_HAVE_THREADSAFETY)
170c20d7725SJed Brown       suffix: 1
171c20d7725SJed Brown       args: -info
172*54606e8bSsdargavi       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
173c20d7725SJed Brown 
174c20d7725SJed Brown    test:
1756c2b77d5SStefano Zampini       requires: defined(PETSC_USE_INFO) !defined(PETSC_HAVE_THREADSAFETY)
176c20d7725SJed Brown       suffix: 2
177cc9df77eSBarry Smith       args: -info ex7info.2
178*54606e8bSsdargavi       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 "ex7info.2.0"
179c20d7725SJed Brown 
180c20d7725SJed Brown    test:
1816c2b77d5SStefano Zampini       requires: defined(PETSC_USE_INFO) !defined(PETSC_HAVE_THREADSAFETY)
182c20d7725SJed Brown       suffix: 3
183c20d7725SJed Brown       nsize: 2
184cc9df77eSBarry Smith       args: -info ex7info.3
185*54606e8bSsdargavi       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 "ex7info.3.0" | sort -b
186c20d7725SJed Brown 
187c20d7725SJed Brown    test:
188dfd57a17SPierre Jolivet       requires: defined(PETSC_USE_INFO)
189c20d7725SJed Brown       suffix: 4
190c20d7725SJed Brown       args: -info :mat,vec:
1913872ee93SStefano Zampini       filter: grep -h -ve Running -ve communicator -ve MPI_Comm -ve OpenMP -ve PetscGetHostName -ve PetscSetFPTrap -ve PetscDetermineInitialFPTrap
192c20d7725SJed Brown 
193c20d7725SJed Brown    test:
194dfd57a17SPierre Jolivet       requires: defined(PETSC_USE_INFO)
195c20d7725SJed Brown       suffix: 5
196c20d7725SJed Brown       args: -info :~sys:
1973872ee93SStefano Zampini       filter: grep -h  -ve PetscSetFPTrap -ve PetscDetermineInitialFPTrap
198c20d7725SJed Brown 
199c20d7725SJed Brown    test:
200dfd57a17SPierre Jolivet       requires: defined(PETSC_USE_INFO)
201c20d7725SJed Brown       suffix: 6
202c20d7725SJed Brown       nsize: 2
203cc9df77eSBarry Smith       args: -info ex7info.6:mat:self
204cc9df77eSBarry Smith       filter: grep -h "ex7info.6.0" | sort -b
2053886731fSPierre Jolivet       output_file: output/empty.out
206c20d7725SJed Brown 
207c20d7725SJed Brown    test:
208dfd57a17SPierre Jolivet       requires: defined(PETSC_USE_INFO)
209c20d7725SJed Brown       suffix: 7
210c20d7725SJed Brown       nsize: 2
211cc9df77eSBarry Smith       args: -info ex7info.7:mat:~self
212cc9df77eSBarry Smith       filter: grep -h "ex7info.7.0" | sort -b
2133886731fSPierre Jolivet       output_file: output/empty.out
214c20d7725SJed Brown 
215c20d7725SJed Brown TEST*/
216