xref: /petsc/src/sys/tutorials/ex6.c (revision 6c37f76f2ace6b1ab1a4a8f1d7a04dee3e7f2aa9)
1*9de6b0b6SToby Isaac const char help[] = "How to create a log handler using legacy callbacks";
2*9de6b0b6SToby Isaac 
3*9de6b0b6SToby Isaac #include <petscsys.h>
4*9de6b0b6SToby Isaac 
5*9de6b0b6SToby Isaac /* Log handlers that use the legacy callbacks have no context pointer,
6*9de6b0b6SToby Isaac    but they can access global logging information.  If your log handler only
7*9de6b0b6SToby Isaac    needs to interact with the arguments to the callback functions and global
8*9de6b0b6SToby Isaac    data structures, the legacy callbacks can be used. */
9*9de6b0b6SToby Isaac 
10*9de6b0b6SToby Isaac #define PrintData(format_string, ...) \
11*9de6b0b6SToby Isaac   do { \
12*9de6b0b6SToby Isaac     PetscMPIInt    rank; \
13*9de6b0b6SToby Isaac     PetscLogDouble time; \
14*9de6b0b6SToby Isaac     PetscCallMPI(MPI_Comm_rank(PETSC_COMM_WORLD, &rank)); \
15*9de6b0b6SToby Isaac     PetscCall(PetscTime(&time)); \
16*9de6b0b6SToby Isaac     PetscCall(PetscPrintf(PETSC_COMM_SELF, "[%d:%g:%-22s] " format_string, rank, time, PETSC_FUNCTION_NAME, __VA_ARGS__)); \
17*9de6b0b6SToby Isaac   } while (0)
18*9de6b0b6SToby Isaac 
MyEventBeginHandler(PetscLogEvent event,int _unused,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4)19*9de6b0b6SToby Isaac static PetscErrorCode MyEventBeginHandler(PetscLogEvent event, int _unused, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
20*9de6b0b6SToby Isaac {
21*9de6b0b6SToby Isaac   const char *name;
22*9de6b0b6SToby Isaac   PetscObject objs[] = {o1, o2, o3, o4};
23*9de6b0b6SToby Isaac 
24*9de6b0b6SToby Isaac   PetscFunctionBegin;
25*9de6b0b6SToby Isaac   PetscCall(PetscLogEventGetName(event, &name));
26*9de6b0b6SToby Isaac   PrintData("event name: %s\n", name);
27*9de6b0b6SToby Isaac   for (int i = 0; i < 4; i++) {
28*9de6b0b6SToby Isaac     if (objs[i]) {
29*9de6b0b6SToby Isaac       const char *obj_name;
30*9de6b0b6SToby Isaac       PetscCall(PetscObjectGetName(objs[i], &obj_name));
31*9de6b0b6SToby Isaac       PrintData("  associated object name: %s\n", obj_name);
32*9de6b0b6SToby Isaac     }
33*9de6b0b6SToby Isaac   }
34*9de6b0b6SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
35*9de6b0b6SToby Isaac }
36*9de6b0b6SToby Isaac 
MyEventEndHandler(PetscLogEvent event,int _unused,PetscObject o1,PetscObject o2,PetscObject o3,PetscObject o4)37*9de6b0b6SToby Isaac static PetscErrorCode MyEventEndHandler(PetscLogEvent event, int _unused, PetscObject o1, PetscObject o2, PetscObject o3, PetscObject o4)
38*9de6b0b6SToby Isaac {
39*9de6b0b6SToby Isaac   const char *name;
40*9de6b0b6SToby Isaac 
41*9de6b0b6SToby Isaac   PetscFunctionBegin;
42*9de6b0b6SToby Isaac   PetscCall(PetscLogEventGetName(event, &name));
43*9de6b0b6SToby Isaac   PrintData("event name: %s\n", name);
44*9de6b0b6SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
45*9de6b0b6SToby Isaac }
46*9de6b0b6SToby Isaac 
MyObjectCreateHandler(PetscObject o)47*9de6b0b6SToby Isaac static PetscErrorCode MyObjectCreateHandler(PetscObject o)
48*9de6b0b6SToby Isaac {
49*9de6b0b6SToby Isaac   const char *obj_class;
50*9de6b0b6SToby Isaac 
51*9de6b0b6SToby Isaac   PetscCall(PetscObjectGetClassName(o, &obj_class));
52*9de6b0b6SToby Isaac   PetscFunctionBegin;
53*9de6b0b6SToby Isaac   PrintData("object class: %s\n", obj_class);
54*9de6b0b6SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
55*9de6b0b6SToby Isaac }
56*9de6b0b6SToby Isaac 
MyObjectDestroyHandler(PetscObject o)57*9de6b0b6SToby Isaac static PetscErrorCode MyObjectDestroyHandler(PetscObject o)
58*9de6b0b6SToby Isaac {
59*9de6b0b6SToby Isaac   const char *obj_class;
60*9de6b0b6SToby Isaac   const char *name;
61*9de6b0b6SToby Isaac 
62*9de6b0b6SToby Isaac   PetscCall(PetscObjectGetClassName(o, &obj_class));
63*9de6b0b6SToby Isaac   PetscCall(PetscObjectGetName(o, &name));
64*9de6b0b6SToby Isaac   PetscFunctionBegin;
65*9de6b0b6SToby Isaac   PrintData("object type: %s, name: %s\n", obj_class, name);
66*9de6b0b6SToby Isaac   PetscFunctionReturn(PETSC_SUCCESS);
67*9de6b0b6SToby Isaac }
68*9de6b0b6SToby Isaac 
main(int argc,char ** argv)69*9de6b0b6SToby Isaac int main(int argc, char **argv)
70*9de6b0b6SToby Isaac {
71*9de6b0b6SToby Isaac   PetscLogEvent  event;
72*9de6b0b6SToby Isaac   PetscLogStage  stage;
73*9de6b0b6SToby Isaac   PetscContainer o1, o2, o3, o4;
74*9de6b0b6SToby Isaac 
75*9de6b0b6SToby Isaac   PetscCall(PetscInitialize(&argc, &argv, NULL, help));
76*9de6b0b6SToby Isaac   PetscCall(PetscLogLegacyCallbacksBegin(MyEventBeginHandler, MyEventEndHandler, MyObjectCreateHandler, MyObjectDestroyHandler));
77*9de6b0b6SToby Isaac   PetscCall(PetscLogStageRegister("User stage", &stage));
78*9de6b0b6SToby Isaac   PetscCall(PetscLogEventRegister("User class", PETSC_CONTAINER_CLASSID, &event));
79*9de6b0b6SToby Isaac   PetscCall(PetscLogStagePush(stage));
80*9de6b0b6SToby Isaac   PetscCall(PetscContainerCreate(PETSC_COMM_WORLD, &o1));
81*9de6b0b6SToby Isaac   PetscCall(PetscObjectSetName((PetscObject)o1, "Container 1"));
82*9de6b0b6SToby Isaac   PetscCall(PetscContainerCreate(PETSC_COMM_WORLD, &o2));
83*9de6b0b6SToby Isaac   PetscCall(PetscObjectSetName((PetscObject)o2, "Container 2"));
84*9de6b0b6SToby Isaac   PetscCall(PetscContainerCreate(PETSC_COMM_WORLD, &o3));
85*9de6b0b6SToby Isaac   PetscCall(PetscObjectSetName((PetscObject)o3, "Container 3"));
86*9de6b0b6SToby Isaac   PetscCall(PetscContainerCreate(PETSC_COMM_WORLD, &o4));
87*9de6b0b6SToby Isaac   PetscCall(PetscObjectSetName((PetscObject)o4, "Container 4"));
88*9de6b0b6SToby Isaac   PetscCall(PetscLogEventBegin(event, o1, o2, o3, o4));
89*9de6b0b6SToby Isaac   PetscCall(PetscLogEventEnd(event, o1, o2, o3, o4));
90*9de6b0b6SToby Isaac   PetscCall(PetscContainerDestroy(&o1));
91*9de6b0b6SToby Isaac   PetscCall(PetscContainerDestroy(&o2));
92*9de6b0b6SToby Isaac   PetscCall(PetscContainerDestroy(&o3));
93*9de6b0b6SToby Isaac   PetscCall(PetscContainerDestroy(&o4));
94*9de6b0b6SToby Isaac   PetscCall(PetscLogStagePop());
95*9de6b0b6SToby Isaac   PetscCall(PetscFinalize());
96*9de6b0b6SToby Isaac   return 0;
97*9de6b0b6SToby Isaac }
98*9de6b0b6SToby Isaac 
99*9de6b0b6SToby Isaac /*TEST
100*9de6b0b6SToby Isaac 
101*9de6b0b6SToby Isaac   test:
102*9de6b0b6SToby Isaac     suffix: 0
103*9de6b0b6SToby Isaac     requires: defined(PETSC_USE_LOG)
104*9de6b0b6SToby Isaac     filter: sed -E "s/:[^:]+:/:time_removed:/g"
105*9de6b0b6SToby Isaac 
106*9de6b0b6SToby Isaac TEST*/
107