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