xref: /petsc/src/sys/objects/pname.c (revision 95452b02e12c0ee11232c7ff2b24b568a8e07e43)
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
12e5c89e4eSSatish Balay          Thus must be cast with a (PetscObject), for example,
13e5c89e4eSSatish Balay          PetscObjectSetName((PetscObject)mat,name);
14e5c89e4eSSatish Balay -  name - the name to give obj
15e5c89e4eSSatish Balay 
16*95452b02SPatrick Sanan    Notes:
17*95452b02SPatrick Sanan     If this routine is not called then the object may end up being name by PetscObjectName().
18e5c89e4eSSatish Balay    Level: advanced
19e5c89e4eSSatish Balay 
20e5c89e4eSSatish Balay    Concepts: object name^setting
21e5c89e4eSSatish Balay 
22343722f2SBarry Smith .seealso: PetscObjectGetName(), PetscObjectName()
23e5c89e4eSSatish Balay @*/
247087cfbeSBarry Smith PetscErrorCode  PetscObjectSetName(PetscObject obj,const char name[])
25e5c89e4eSSatish Balay {
26e5c89e4eSSatish Balay   PetscErrorCode ierr;
27e5c89e4eSSatish Balay 
28e5c89e4eSSatish Balay   PetscFunctionBegin;
293cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
30503cfb0cSBarry Smith   ierr = PetscFree(obj->name);CHKERRQ(ierr);
31e5c89e4eSSatish Balay   ierr = PetscStrallocpy(name,&obj->name);CHKERRQ(ierr);
32e5c89e4eSSatish Balay   PetscFunctionReturn(0);
33e5c89e4eSSatish Balay }
34e5c89e4eSSatish Balay 
35317d6ea6SBarry Smith /*@C
36317d6ea6SBarry Smith       PetscObjectPrintTypeNamePrefix - used in the XXXView() methods to display information about the class, name, prefix and type of an object
37317d6ea6SBarry Smith 
38317d6ea6SBarry Smith    Input Parameters:
39317d6ea6SBarry Smith +     obj - the PETSc object
4098c3331eSBarry Smith -     viewer - ASCII viewer where the information is printed, function does nothing if the viewer is not PETSCVIEWERASCII type
41317d6ea6SBarry Smith 
42317d6ea6SBarry Smith    Level: developer
43317d6ea6SBarry Smith 
44*95452b02SPatrick Sanan    Notes:
45*95452b02SPatrick Sanan     If the viewer format is PETSC_VIEWER_ASCII_MATLAB then the information is printed after a % symbol
4698c3331eSBarry Smith           so that MATLAB will treat it as a comment.
4798c3331eSBarry Smith 
4847a3fc75SMatthew G. Knepley           If the viewer format is PETSC_VIEWER_ASCII_VTK*, PETSC_VIEWER_ASCII_LATEX, or
499bc64357SJonathan Guyer           PETSC_VIEWER_ASCII_MATRIXMARKET then don't print header information
509bc64357SJonathan Guyer           as these formats can't process it.
519bc64357SJonathan Guyer 
5223f88b65SBarry Smith    Developer Note: The flag donotPetscObjectPrintClassNamePrefixType is useful to prevent double printing of the information when recursion is used
5323f88b65SBarry Smith                    to actually print the object.
5423f88b65SBarry Smith 
55317d6ea6SBarry Smith .seealso: PetscObjectSetName(), PetscObjectName()
56317d6ea6SBarry Smith 
57317d6ea6SBarry Smith @*/
58dae58748SBarry Smith PetscErrorCode PetscObjectPrintClassNamePrefixType(PetscObject obj,PetscViewer viewer)
59317d6ea6SBarry Smith {
60317d6ea6SBarry Smith   PetscErrorCode    ierr;
61369bc716SBarry Smith   MPI_Comm          comm;
62369bc716SBarry Smith   PetscMPIInt       size;
6398c3331eSBarry Smith   PetscViewerFormat format;
6498c3331eSBarry Smith   PetscBool         flg;
65317d6ea6SBarry Smith 
66317d6ea6SBarry Smith   PetscFunctionBegin;
6798c3331eSBarry Smith   ierr = PetscObjectTypeCompare((PetscObject)viewer,PETSCVIEWERASCII,&flg);CHKERRQ(ierr);
6823f88b65SBarry Smith   if (obj->donotPetscObjectPrintClassNamePrefixType) PetscFunctionReturn(0);
6998c3331eSBarry Smith   if (!flg) PetscFunctionReturn(0);
7098c3331eSBarry Smith 
7198c3331eSBarry Smith   ierr = PetscViewerGetFormat(viewer,&format);CHKERRQ(ierr);
728135c375SStefano Zampini   if (format == PETSC_VIEWER_ASCII_VTK || format == PETSC_VIEWER_ASCII_VTK_CELL || format == PETSC_VIEWER_ASCII_VTK_COORDS || format == PETSC_VIEWER_ASCII_MATRIXMARKET || format == PETSC_VIEWER_ASCII_LATEX || format == PETSC_VIEWER_ASCII_GLVIS) PetscFunctionReturn(0);
731678b73fSBarry Smith 
7498c3331eSBarry Smith   if (format == PETSC_VIEWER_ASCII_MATLAB) {ierr = PetscViewerASCIIPrintf(viewer,"%%");CHKERRQ(ierr);}
75dae58748SBarry Smith   ierr = PetscViewerASCIIPrintf(viewer,"%s Object:",obj->class_name);CHKERRQ(ierr);
76fe2c5cf5SJose E. Roman   ierr = PetscViewerASCIIUseTabs(viewer,PETSC_FALSE);CHKERRQ(ierr);
77317d6ea6SBarry Smith   if (obj->name) {
78317d6ea6SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer," %s",obj->name);CHKERRQ(ierr);
79317d6ea6SBarry Smith   }
80317d6ea6SBarry Smith   if (obj->prefix) {
81317d6ea6SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer," (%s)",obj->prefix);CHKERRQ(ierr);
82317d6ea6SBarry Smith   }
83369bc716SBarry Smith   ierr = PetscObjectGetComm(obj,&comm);CHKERRQ(ierr);
84369bc716SBarry Smith   ierr = MPI_Comm_size(comm,&size);CHKERRQ(ierr);
852f87826bSBarry Smith   ierr = PetscViewerASCIIPrintf(viewer," %d MPI processes\n",size);CHKERRQ(ierr);
86fe2c5cf5SJose E. Roman   ierr = PetscViewerASCIIUseTabs(viewer,PETSC_TRUE);CHKERRQ(ierr);
8798c3331eSBarry Smith   if (format == PETSC_VIEWER_ASCII_MATLAB) {ierr = PetscViewerASCIIPrintf(viewer,"%%");CHKERRQ(ierr);}
88317d6ea6SBarry Smith   if (obj->type_name) {
89317d6ea6SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  type: %s\n",obj->type_name);CHKERRQ(ierr);
90317d6ea6SBarry Smith   } else {
91317d6ea6SBarry Smith     ierr = PetscViewerASCIIPrintf(viewer,"  type not yet set\n");CHKERRQ(ierr);
92317d6ea6SBarry Smith   }
93317d6ea6SBarry Smith   PetscFunctionReturn(0);
94317d6ea6SBarry Smith }
95317d6ea6SBarry Smith 
96e5c89e4eSSatish Balay /*@C
97e5c89e4eSSatish Balay    PetscObjectName - Gives an object a name if it does not have one
98e5c89e4eSSatish Balay 
99199a6bf1SJed Brown    Collective
100e5c89e4eSSatish Balay 
101e5c89e4eSSatish Balay    Input Parameters:
102e5c89e4eSSatish Balay .  obj - the Petsc variable
103e5c89e4eSSatish Balay          Thus must be cast with a (PetscObject), for example,
104317d6ea6SBarry Smith          PetscObjectName((PetscObject)mat,name);
105e5c89e4eSSatish Balay 
106317d6ea6SBarry Smith    Level: developer
107e5c89e4eSSatish Balay 
108e5c89e4eSSatish Balay    Concepts: object name^setting default
109e5c89e4eSSatish Balay 
110*95452b02SPatrick Sanan    Notes:
111*95452b02SPatrick 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.
112e04113cfSBarry Smith           Use PetscObjectSetName() to set the name of an object to what you want. The SAWs viewer requires that no two published objects
1139ddcd10cSBarry Smith           share the same name.
1149ddcd10cSBarry Smith 
1159ddcd10cSBarry Smith    Developer Note: this needs to generate the exact same string on all ranks that share the object. The current algorithm may not always work.
1169ddcd10cSBarry Smith 
1179ddcd10cSBarry Smith 
118317d6ea6SBarry Smith 
119e5c89e4eSSatish Balay .seealso: PetscObjectGetName(), PetscObjectSetName()
120e5c89e4eSSatish Balay @*/
1217087cfbeSBarry Smith PetscErrorCode  PetscObjectName(PetscObject obj)
122e5c89e4eSSatish Balay {
123e5c89e4eSSatish Balay   PetscErrorCode   ierr;
124480cf27aSJed Brown   PetscCommCounter *counter;
125480cf27aSJed Brown   PetscMPIInt      flg;
126e5c89e4eSSatish Balay   char             name[64];
127e5c89e4eSSatish Balay 
128e5c89e4eSSatish Balay   PetscFunctionBegin;
1293cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
130e5c89e4eSSatish Balay   if (!obj->name) {
1319fe7d45dSJed Brown     union {MPI_Comm comm; void *ptr; char raw[sizeof(MPI_Comm)]; } ucomm;
13247435625SJed Brown     ierr = MPI_Comm_get_attr(obj->comm,Petsc_Counter_keyval,(void*)&counter,&flg);CHKERRQ(ierr);
133e32f2f54SBarry Smith     if (!flg) SETERRQ(PETSC_COMM_SELF,PETSC_ERR_ARG_CORRUPT,"Bad MPI communicator supplied; must be a PETSc communicator");
1349fe7d45dSJed Brown     ucomm.ptr = NULL;
1359fe7d45dSJed Brown     ucomm.comm = obj->comm;
1369fe7d45dSJed Brown     ierr = MPI_Bcast(ucomm.raw,sizeof(MPI_Comm),MPI_BYTE,0,obj->comm);CHKERRQ(ierr);
1379fe7d45dSJed Brown     /* If the union has extra bytes, their value is implementation-dependent, but they will normally be what we set last
1389fe7d45dSJed Brown      * in 'ucomm.ptr = NULL'.  This output is always implementation-defined (and varies from run to run) so the union
1399fe7d45dSJed Brown      * abuse acceptable. */
1409fe7d45dSJed Brown     ierr = PetscSNPrintf(name,64,"%s_%p_%D",obj->class_name,ucomm.ptr,counter->namecount++);CHKERRQ(ierr);
141e5c89e4eSSatish Balay     ierr = PetscStrallocpy(name,&obj->name);CHKERRQ(ierr);
142e5c89e4eSSatish Balay   }
143e5c89e4eSSatish Balay   PetscFunctionReturn(0);
144e5c89e4eSSatish Balay }
145e5c89e4eSSatish Balay 
146e5c89e4eSSatish Balay 
147e5c89e4eSSatish Balay 
1487087cfbeSBarry Smith PetscErrorCode  PetscObjectChangeTypeName(PetscObject obj,const char type_name[])
149e5c89e4eSSatish Balay {
150e5c89e4eSSatish Balay   PetscErrorCode ierr;
151e5c89e4eSSatish Balay 
152e5c89e4eSSatish Balay   PetscFunctionBegin;
1533cfa8680SLisandro Dalcin   PetscValidHeader(obj,1);
154503cfb0cSBarry Smith   ierr = PetscFree(obj->type_name);CHKERRQ(ierr);
155e5c89e4eSSatish Balay   ierr = PetscStrallocpy(type_name,&obj->type_name);CHKERRQ(ierr);
156f6291634SJed Brown   /* Clear all the old subtype callbacks so they can't accidentally be called (shouldn't happen anyway) */
157f6291634SJed Brown   ierr = PetscMemzero(obj->fortrancallback[PETSC_FORTRAN_CALLBACK_SUBTYPE],obj->num_fortrancallback[PETSC_FORTRAN_CALLBACK_SUBTYPE]*sizeof(PetscFortranCallback));CHKERRQ(ierr);
158e5c89e4eSSatish Balay   PetscFunctionReturn(0);
159e5c89e4eSSatish Balay }
160e5c89e4eSSatish Balay 
161