Actual source code: pname.c
2: #include <petsc/private/petscimpl.h>
3: #include <petscviewer.h>
5: /*@C
6: PetscObjectSetName - Sets a string name associated with a PETSc object.
8: Not Collective
10: Input Parameters:
11: + obj - the Petsc variable
12: Thus must be cast with a (`PetscObject`), for example,
13: `PetscObjectSetName`((`PetscObject`)mat,name);
14: - name - the name to give obj
16: Level: advanced
18: Note:
19: If this routine is not called then the object may end up being name by `PetscObjectName()`.
21: .seealso: `PetscObjectGetName()`, `PetscObjectName()`
22: @*/
23: PetscErrorCode PetscObjectSetName(PetscObject obj, const char name[])
24: {
25: PetscFunctionBegin;
27: PetscCall(PetscFree(obj->name));
28: PetscCall(PetscStrallocpy(name, &obj->name));
29: PetscFunctionReturn(PETSC_SUCCESS);
30: }
32: /*@C
33: PetscObjectPrintClassNamePrefixType - used in the `XXXView()` methods to display information about the class, name, prefix and type of an object
35: Input Parameters:
36: + obj - the PETSc object
37: - viewer - `PETSCVIEWERASCII` viewer where the information is printed, function does nothing if the viewer is not `PETSCVIEWERASCII` type
39: Level: developer
41: Notes:
42: If the viewer format is `PETSC_VIEWER_ASCII_MATLAB` then the information is printed after a % symbol
43: so that MATLAB will treat it as a comment.
45: If the viewer format is `PETSC_VIEWER_ASCII_VTK*`, `PETSC_VIEWER_ASCII_LATEX`, or
46: `PETSC_VIEWER_ASCII_MATRIXMARKET` then don't print header information
47: as these formats can't process it.
49: Developer Note:
50: The flag donotPetscObjectPrintClassNamePrefixType is useful to prevent double printing of the information when recursion is used to actually print the object.
52: .seealso: `PetscObjectSetName()`, `PetscObjectName()`
53: @*/
54: PetscErrorCode PetscObjectPrintClassNamePrefixType(PetscObject obj, PetscViewer viewer)
55: {
56: PetscMPIInt size;
57: PetscViewerFormat format;
58: PetscBool flg;
60: PetscFunctionBegin;
61: PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &flg));
62: if (obj->donotPetscObjectPrintClassNamePrefixType) PetscFunctionReturn(PETSC_SUCCESS);
63: if (!flg) PetscFunctionReturn(PETSC_SUCCESS);
65: PetscCall(PetscViewerGetFormat(viewer, &format));
66: if (format == PETSC_VIEWER_ASCII_VTK_DEPRECATED || format == PETSC_VIEWER_ASCII_VTK_CELL_DEPRECATED || format == PETSC_VIEWER_ASCII_VTK_COORDS_DEPRECATED || format == PETSC_VIEWER_ASCII_MATRIXMARKET || format == PETSC_VIEWER_ASCII_LATEX || format == PETSC_VIEWER_ASCII_GLVIS)
67: PetscFunctionReturn(PETSC_SUCCESS);
69: if (format == PETSC_VIEWER_ASCII_MATLAB) PetscCall(PetscViewerASCIIPrintf(viewer, "%%"));
70: PetscCallMPI(MPI_Comm_size(PetscObjectComm(obj), &size));
71: PetscCall(PetscViewerASCIIPrintf(viewer, "%s Object:%s%s%s%s%s %d MPI process%s\n", obj->class_name, obj->name ? " " : "", obj->name ? obj->name : "", obj->prefix ? " (" : "", obj->prefix ? obj->prefix : "", obj->prefix ? ")" : "", size, size > 1 ? "es" : ""));
72: if (format == PETSC_VIEWER_ASCII_MATLAB) PetscCall(PetscViewerASCIIPrintf(viewer, "%%"));
73: if (obj->type_name) {
74: PetscCall(PetscViewerASCIIPrintf(viewer, " type: %s\n", obj->type_name));
75: } else {
76: PetscCall(PetscViewerASCIIPrintf(viewer, " type not yet set\n"));
77: }
78: PetscFunctionReturn(PETSC_SUCCESS);
79: }
81: /*@C
82: PetscObjectName - Gives an object a name if it does not have one
84: Collective
86: Input Parameter:
87: . obj - the Petsc variable
88: Thus must be cast with a (`PetscObject`), for example,
89: `PetscObjectName`((`PetscObject`)mat,name);
91: Level: developer
93: Notes:
94: This is used in a small number of places when an object NEEDS a name, for example when it is saved to MATLAB with that variable name.
96: Use `PetscObjectSetName()` to set the name of an object to what you want. The SAWs viewer requires that no two published objects
97: share the same name.
99: Developer Note:
100: This needs to generate the exact same string on all ranks that share the object. The current algorithm may not always work.
102: .seealso: `PetscObjectGetName()`, `PetscObjectSetName()`
103: @*/
104: PetscErrorCode PetscObjectName(PetscObject obj)
105: {
106: PetscCommCounter *counter;
107: PetscMPIInt flg;
108: char name[64];
110: PetscFunctionBegin;
112: if (!obj->name) {
113: union
114: {
115: MPI_Comm comm;
116: void *ptr;
117: char raw[sizeof(MPI_Comm)];
118: } ucomm;
119: PetscCallMPI(MPI_Comm_get_attr(obj->comm, Petsc_Counter_keyval, (void *)&counter, &flg));
120: PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "Bad MPI communicator supplied; must be a PETSc communicator");
121: ucomm.ptr = NULL;
122: ucomm.comm = obj->comm;
123: PetscCallMPI(MPI_Bcast(ucomm.raw, sizeof(MPI_Comm), MPI_BYTE, 0, obj->comm));
124: /* If the union has extra bytes, their value is implementation-dependent, but they will normally be what we set last
125: * in 'ucomm.ptr = NULL'. This output is always implementation-defined (and varies from run to run) so the union
126: * abuse acceptable. */
127: PetscCall(PetscSNPrintf(name, 64, "%s_%p_%" PetscInt_FMT, obj->class_name, ucomm.ptr, counter->namecount++));
128: PetscCall(PetscStrallocpy(name, &obj->name));
129: }
130: PetscFunctionReturn(PETSC_SUCCESS);
131: }
133: PetscErrorCode PetscObjectChangeTypeName(PetscObject obj, const char type_name[])
134: {
135: PetscFunctionBegin;
137: PetscCall(PetscFree(obj->type_name));
138: PetscCall(PetscStrallocpy(type_name, &obj->type_name));
139: /* Clear all the old subtype callbacks so they can't accidentally be called (shouldn't happen anyway) */
140: PetscCall(PetscMemzero(obj->fortrancallback[PETSC_FORTRAN_CALLBACK_SUBTYPE], obj->num_fortrancallback[PETSC_FORTRAN_CALLBACK_SUBTYPE] * sizeof(PetscFortranCallback)));
141: PetscFunctionReturn(PETSC_SUCCESS);
142: }