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: }