xref: /petsc/src/sys/objects/pname.c (revision 21532e8a5a1a1e7911222ee0f2ed1e65b4f3f1d8)
1e5c89e4eSSatish Balay 
2af0996ceSBarry Smith #include <petsc/private/petscimpl.h> /*I    "petscsys.h"   I*/
3665c2dedSJed Brown #include <petscviewer.h>
4e5c89e4eSSatish Balay 
5e5c89e4eSSatish Balay /*@C
6e5c89e4eSSatish Balay    PetscObjectSetName - Sets a string name associated with a PETSc object.
7e5c89e4eSSatish Balay 
8e5c89e4eSSatish Balay    Not Collective
9e5c89e4eSSatish Balay 
10e5c89e4eSSatish Balay    Input Parameters:
11e5c89e4eSSatish Balay +  obj - the Petsc variable
12811af0c4SBarry Smith          Thus must be cast with a (`PetscObject`), for example,
13811af0c4SBarry Smith          `PetscObjectSetName`((`PetscObject`)mat,name);
14e5c89e4eSSatish Balay -  name - the name to give obj
15e5c89e4eSSatish Balay 
16e5c89e4eSSatish Balay    Level: advanced
17e5c89e4eSSatish Balay 
18811af0c4SBarry Smith    Note:
19811af0c4SBarry Smith     If this routine is not called then the object may end up being name by `PetscObjectName()`.
20811af0c4SBarry Smith 
21db781477SPatrick Sanan .seealso: `PetscObjectGetName()`, `PetscObjectName()`
22e5c89e4eSSatish Balay @*/
23d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectSetName(PetscObject obj, const char name[])
24d71ae5a4SJacob Faibussowitsch {
25e5c89e4eSSatish Balay   PetscFunctionBegin;
263cfa8680SLisandro Dalcin   PetscValidHeader(obj, 1);
279566063dSJacob Faibussowitsch   PetscCall(PetscFree(obj->name));
289566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(name, &obj->name));
293ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
30e5c89e4eSSatish Balay }
31e5c89e4eSSatish Balay 
32317d6ea6SBarry Smith /*@C
33811af0c4SBarry Smith       PetscObjectPrintClassNamePrefixType - used in the `XXXView()` methods to display information about the class, name, prefix and type of an object
34317d6ea6SBarry Smith 
35317d6ea6SBarry Smith    Input Parameters:
36317d6ea6SBarry Smith +     obj - the PETSc object
37*21532e8aSBarry Smith -     viewer - `PETSCVIEWERASCII` viewer where the information is printed, function does nothing if the viewer is not `PETSCVIEWERASCII` type
38317d6ea6SBarry Smith 
39317d6ea6SBarry Smith    Level: developer
40317d6ea6SBarry Smith 
4195452b02SPatrick Sanan    Notes:
42811af0c4SBarry Smith    If the viewer format is `PETSC_VIEWER_ASCII_MATLAB` then the information is printed after a % symbol
4398c3331eSBarry Smith    so that MATLAB will treat it as a comment.
4498c3331eSBarry Smith 
45811af0c4SBarry Smith    If the viewer format is `PETSC_VIEWER_ASCII_VTK*`, `PETSC_VIEWER_ASCII_LATEX`, or
46811af0c4SBarry Smith    `PETSC_VIEWER_ASCII_MATRIXMARKET` then don't print header information
479bc64357SJonathan Guyer    as these formats can't process it.
489bc64357SJonathan Guyer 
49811af0c4SBarry Smith    Developer Note:
50811af0c4SBarry Smith    The flag donotPetscObjectPrintClassNamePrefixType is useful to prevent double printing of the information when recursion is used to actually print the object.
5123f88b65SBarry Smith 
52db781477SPatrick Sanan .seealso: `PetscObjectSetName()`, `PetscObjectName()`
53317d6ea6SBarry Smith @*/
54d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectPrintClassNamePrefixType(PetscObject obj, PetscViewer viewer)
55d71ae5a4SJacob Faibussowitsch {
56369bc716SBarry Smith   PetscMPIInt       size;
5798c3331eSBarry Smith   PetscViewerFormat format;
5898c3331eSBarry Smith   PetscBool         flg;
59317d6ea6SBarry Smith 
60317d6ea6SBarry Smith   PetscFunctionBegin;
619566063dSJacob Faibussowitsch   PetscCall(PetscObjectTypeCompare((PetscObject)viewer, PETSCVIEWERASCII, &flg));
623ba16761SJacob Faibussowitsch   if (obj->donotPetscObjectPrintClassNamePrefixType) PetscFunctionReturn(PETSC_SUCCESS);
633ba16761SJacob Faibussowitsch   if (!flg) PetscFunctionReturn(PETSC_SUCCESS);
6498c3331eSBarry Smith 
659566063dSJacob Faibussowitsch   PetscCall(PetscViewerGetFormat(viewer, &format));
669371c9d4SSatish Balay   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)
673ba16761SJacob Faibussowitsch     PetscFunctionReturn(PETSC_SUCCESS);
681678b73fSBarry Smith 
699566063dSJacob Faibussowitsch   if (format == PETSC_VIEWER_ASCII_MATLAB) PetscCall(PetscViewerASCIIPrintf(viewer, "%%"));
708cc725e6SPierre Jolivet   PetscCallMPI(MPI_Comm_size(PetscObjectComm(obj), &size));
718cc725e6SPierre Jolivet   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" : ""));
729566063dSJacob Faibussowitsch   if (format == PETSC_VIEWER_ASCII_MATLAB) PetscCall(PetscViewerASCIIPrintf(viewer, "%%"));
73317d6ea6SBarry Smith   if (obj->type_name) {
749566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  type: %s\n", obj->type_name));
75317d6ea6SBarry Smith   } else {
769566063dSJacob Faibussowitsch     PetscCall(PetscViewerASCIIPrintf(viewer, "  type not yet set\n"));
77317d6ea6SBarry Smith   }
783ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
79317d6ea6SBarry Smith }
80317d6ea6SBarry Smith 
81e5c89e4eSSatish Balay /*@C
82e5c89e4eSSatish Balay    PetscObjectName - Gives an object a name if it does not have one
83e5c89e4eSSatish Balay 
84199a6bf1SJed Brown    Collective
85e5c89e4eSSatish Balay 
862fe279fdSBarry Smith    Input Parameter:
87e5c89e4eSSatish Balay .  obj - the Petsc variable
88811af0c4SBarry Smith          Thus must be cast with a (`PetscObject`), for example,
89811af0c4SBarry Smith          `PetscObjectName`((`PetscObject`)mat,name);
90e5c89e4eSSatish Balay 
91317d6ea6SBarry Smith    Level: developer
92e5c89e4eSSatish Balay 
9395452b02SPatrick Sanan    Notes:
9495452b02SPatrick Sanan    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.
95811af0c4SBarry Smith 
96811af0c4SBarry Smith    Use `PetscObjectSetName()` to set the name of an object to what you want. The SAWs viewer requires that no two published objects
979ddcd10cSBarry Smith    share the same name.
989ddcd10cSBarry Smith 
99811af0c4SBarry Smith    Developer Note:
100811af0c4SBarry Smith    This needs to generate the exact same string on all ranks that share the object. The current algorithm may not always work.
1019ddcd10cSBarry Smith 
102db781477SPatrick Sanan .seealso: `PetscObjectGetName()`, `PetscObjectSetName()`
103e5c89e4eSSatish Balay @*/
104d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectName(PetscObject obj)
105d71ae5a4SJacob Faibussowitsch {
106480cf27aSJed Brown   PetscCommCounter *counter;
107480cf27aSJed Brown   PetscMPIInt       flg;
108e5c89e4eSSatish Balay   char              name[64];
109e5c89e4eSSatish Balay 
110e5c89e4eSSatish Balay   PetscFunctionBegin;
1113cfa8680SLisandro Dalcin   PetscValidHeader(obj, 1);
112e5c89e4eSSatish Balay   if (!obj->name) {
1139371c9d4SSatish Balay     union
1149371c9d4SSatish Balay     {
1159371c9d4SSatish Balay       MPI_Comm comm;
1169371c9d4SSatish Balay       void    *ptr;
1179371c9d4SSatish Balay       char     raw[sizeof(MPI_Comm)];
1189371c9d4SSatish Balay     } ucomm;
1199566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Comm_get_attr(obj->comm, Petsc_Counter_keyval, (void *)&counter, &flg));
12028b400f6SJacob Faibussowitsch     PetscCheck(flg, PETSC_COMM_SELF, PETSC_ERR_ARG_CORRUPT, "Bad MPI communicator supplied; must be a PETSc communicator");
1219fe7d45dSJed Brown     ucomm.ptr  = NULL;
1229fe7d45dSJed Brown     ucomm.comm = obj->comm;
1239566063dSJacob Faibussowitsch     PetscCallMPI(MPI_Bcast(ucomm.raw, sizeof(MPI_Comm), MPI_BYTE, 0, obj->comm));
1249fe7d45dSJed Brown     /* If the union has extra bytes, their value is implementation-dependent, but they will normally be what we set last
1259fe7d45dSJed Brown      * in 'ucomm.ptr = NULL'.  This output is always implementation-defined (and varies from run to run) so the union
1269fe7d45dSJed Brown      * abuse acceptable. */
1279566063dSJacob Faibussowitsch     PetscCall(PetscSNPrintf(name, 64, "%s_%p_%" PetscInt_FMT, obj->class_name, ucomm.ptr, counter->namecount++));
1289566063dSJacob Faibussowitsch     PetscCall(PetscStrallocpy(name, &obj->name));
129e5c89e4eSSatish Balay   }
1303ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
131e5c89e4eSSatish Balay }
132e5c89e4eSSatish Balay 
133d71ae5a4SJacob Faibussowitsch PetscErrorCode PetscObjectChangeTypeName(PetscObject obj, const char type_name[])
134d71ae5a4SJacob Faibussowitsch {
135e5c89e4eSSatish Balay   PetscFunctionBegin;
1363cfa8680SLisandro Dalcin   PetscValidHeader(obj, 1);
1379566063dSJacob Faibussowitsch   PetscCall(PetscFree(obj->type_name));
1389566063dSJacob Faibussowitsch   PetscCall(PetscStrallocpy(type_name, &obj->type_name));
139f6291634SJed Brown   /* Clear all the old subtype callbacks so they can't accidentally be called (shouldn't happen anyway) */
1409566063dSJacob Faibussowitsch   PetscCall(PetscMemzero(obj->fortrancallback[PETSC_FORTRAN_CALLBACK_SUBTYPE], obj->num_fortrancallback[PETSC_FORTRAN_CALLBACK_SUBTYPE] * sizeof(PetscFortranCallback)));
1413ba16761SJacob Faibussowitsch   PetscFunctionReturn(PETSC_SUCCESS);
142e5c89e4eSSatish Balay }
143