Actual source code: xmlviewer.c
1: /*************************************************************************************
2: * M A R I T I M E R E S E A R C H I N S T I T U T E N E T H E R L A N D S *
3: *************************************************************************************
4: * authors: Koos Huijssen, Christiaan M. Klaij *
5: *************************************************************************************
6: * content: Viewer for writing XML output *
7: *************************************************************************************/
8: #include <petscviewer.h>
9: #include <petsc/private/logimpl.h>
10: #include <petsc/private/fortranimpl.h>
11: #include "../src/sys/logging/xmlviewer.h"
13: #if defined(PETSC_USE_LOG)
15: static int XMLSectionDepth = 0;
17: PetscErrorCode PetscViewerXMLStartSection(PetscViewer viewer, const char *name, const char *desc)
18: {
19: PetscFunctionBegin;
20: if (!desc) {
21: PetscCall(PetscViewerASCIIPrintf(viewer, "%*s<%s>\n", XMLSectionDepth, "", name));
22: } else {
23: PetscCall(PetscViewerASCIIPrintf(viewer, "%*s<%s desc=\"%s\">\n", XMLSectionDepth, "", name, desc));
24: }
25: XMLSectionDepth += 2;
26: PetscFunctionReturn(PETSC_SUCCESS);
27: }
29: /* Initialize a viewer to XML, and initialize the XMLDepth static parameter */
30: PetscErrorCode PetscViewerInitASCII_XML(PetscViewer viewer)
31: {
32: MPI_Comm comm;
33: char PerfScript[PETSC_MAX_PATH_LEN + 40];
35: PetscFunctionBegin;
36: PetscCall(PetscObjectGetComm((PetscObject)viewer, &comm));
37: PetscCall(PetscViewerASCIIPrintf(viewer, "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"));
38: PetscCall(PetscStrreplace(comm, "<?xml-stylesheet type=\"text/xsl\" href=\"performance_xml2html.xsl\"?>", PerfScript, sizeof(PerfScript)));
39: PetscCall(PetscViewerASCIIPrintf(viewer, "%s\n", PerfScript));
40: XMLSectionDepth = 0;
41: PetscCall(PetscViewerXMLStartSection(viewer, "root", NULL));
42: PetscFunctionReturn(PETSC_SUCCESS);
43: }
45: /* Initialize a viewer to XML, and initialize the XMLDepth static parameter */
46: PetscErrorCode PetscViewerFinalASCII_XML(PetscViewer viewer)
47: {
48: PetscFunctionBegin;
49: PetscCall(PetscViewerXMLEndSection(viewer, "root"));
50: PetscFunctionReturn(PETSC_SUCCESS);
51: }
53: PetscErrorCode PetscViewerXMLEndSection(PetscViewer viewer, const char *name)
54: {
55: PetscFunctionBegin;
56: XMLSectionDepth -= 2;
57: if (XMLSectionDepth < 0) XMLSectionDepth = 0;
58: PetscCall(PetscViewerASCIIPrintf(viewer, "%*s</%s>\n", XMLSectionDepth, "", name));
59: PetscFunctionReturn(PETSC_SUCCESS);
60: }
62: PetscErrorCode PetscViewerXMLPutString(PetscViewer viewer, const char *name, const char *desc, const char *value)
63: {
64: PetscFunctionBegin;
65: if (!desc) {
66: PetscCall(PetscViewerASCIIPrintf(viewer, "%*s<%s>%s</%s>\n", XMLSectionDepth, "", name, value, name));
67: } else {
68: PetscCall(PetscViewerASCIIPrintf(viewer, "%*s<%s desc=\"%s\">%s</%s>\n", XMLSectionDepth, "", name, desc, value, name));
69: }
70: PetscFunctionReturn(PETSC_SUCCESS);
71: }
73: PetscErrorCode PetscViewerXMLPutInt(PetscViewer viewer, const char *name, const char *desc, int value)
74: {
75: PetscFunctionBegin;
76: if (!desc) {
77: PetscCall(PetscViewerASCIIPrintf(viewer, "%*s<%s>%d</%s>\n", XMLSectionDepth, "", name, value, name));
78: } else {
79: PetscCall(PetscViewerASCIIPrintf(viewer, "%*s<%s desc=\"%s\">%d</%s>\n", XMLSectionDepth, "", name, desc, value, name));
80: }
81: PetscFunctionReturn(PETSC_SUCCESS);
82: }
84: PetscErrorCode PetscViewerXMLPutDouble(PetscViewer viewer, const char *name, const char *desc, PetscLogDouble value, const char *format)
85: {
86: char buffer[1024];
88: PetscFunctionBegin;
89: if (!desc) {
90: PetscCall(PetscSNPrintf(buffer, sizeof(buffer), "%*s<%s>%s</%s>\n", XMLSectionDepth, "", name, format, name));
91: } else {
92: PetscCall(PetscSNPrintf(buffer, sizeof(buffer), "%*s<%s desc=\"%s\">%s</%s>\n", XMLSectionDepth, "", name, desc, format, name));
93: }
94: PetscCall(PetscViewerASCIIPrintf(viewer, buffer, value));
95: PetscFunctionReturn(PETSC_SUCCESS);
96: }
98: #endif