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, (char *)0, 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*/