1 #define PETSC_DLL 2 /* 3 Provides utility routines for manulating any type of PETSc object. 4 */ 5 #include "petsc.h" /*I "petsc.h" I*/ 6 7 struct _p_Object { 8 PETSCHEADER(int); 9 }; 10 11 PetscErrorCode PetscObjectDestroy_PetscObject(PetscObject obj) 12 { 13 PetscErrorCode ierr; 14 PetscFunctionBegin; 15 PetscValidHeader(obj,1); 16 if (--obj->refct > 0) PetscFunctionReturn(0); 17 ierr = PetscHeaderDestroy(obj);CHKERRQ(ierr); 18 PetscFunctionReturn(0); 19 } 20 21 #undef __FUNCT__ 22 #define __FUNCT__ "PetscObjectCreate" 23 /*@C 24 PetscObjectCreate - Creates a PetscObject 25 26 Collective on PetscObject 27 28 Input Parameter: 29 . comm - An MPI communicator 30 31 Output Parameter: 32 . obj - The object 33 34 Level: developer 35 36 Notes: This is a template intended as a starting point to cut and paste with PetscObjectDestroy_PetscObject() 37 to make new object classes. 38 39 Concepts: destroying object 40 Concepts: freeing object 41 Concepts: deleting object 42 43 @*/ 44 PetscErrorCode PETSC_DLLEXPORT PetscObjectCreate(MPI_Comm comm, PetscObject *obj) 45 { 46 PetscObject o; 47 PetscErrorCode ierr; 48 49 PetscFunctionBegin; 50 PetscValidPointer(obj,2); 51 52 #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) 53 ierr = PetscInitializePackage(PETSC_NULL);CHKERRQ(ierr); 54 #endif 55 ierr = PetscHeaderCreate(o,_p_PetscObject,-1,PETSC_OBJECT_COOKIE,0,"PetscObject",comm,PetscObjectDestroy_PetscObject,0);CHKERRQ(ierr); 56 /* records not yet defined in PetscObject 57 o->data = 0; 58 o->setupcalled = 0; 59 */ 60 *obj = o; 61 PetscFunctionReturn(0); 62 } 63 64 #undef __FUNCT__ 65 #define __FUNCT__ "PetscObjectCreateGeneric" 66 /*@C 67 PetscObjectCreateGeneric - Creates a PetscObject 68 69 Collective on PetscObject 70 71 Input Parameter: 72 + comm - An MPI communicator 73 . cookie - The class cookie 74 - name - The class name 75 76 Output Parameter: 77 . obj - The object 78 79 Level: developer 80 81 Notes: This is a template intended as a starting point to cut and paste with PetscObjectDestroy_PetscObject() 82 to make new object classes. 83 84 Concepts: destroying object 85 Concepts: freeing object 86 Concepts: deleting object 87 88 @*/ 89 PetscErrorCode PETSC_DLLEXPORT PetscObjectCreateGeneric(MPI_Comm comm, PetscCookie cookie, const char name[], PetscObject *obj) 90 { 91 PetscObject o; 92 PetscErrorCode ierr; 93 94 PetscFunctionBegin; 95 PetscValidPointer(obj,2); 96 97 #if !defined(PETSC_USE_DYNAMIC_LIBRARIES) 98 ierr = PetscInitializePackage(PETSC_NULL);CHKERRQ(ierr); 99 #endif 100 ierr = PetscHeaderCreate(o,_p_PetscObject,-1,cookie,0,name,comm,PetscObjectDestroy_PetscObject,0);CHKERRQ(ierr); 101 /* records not yet defined in PetscObject 102 o->data = 0; 103 o->setupcalled = 0; 104 */ 105 *obj = o; 106 PetscFunctionReturn(0); 107 } 108 109 #undef __FUNCT__ 110 #define __FUNCT__ "PetscObjectDestroy" 111 /*@ 112 PetscObjectDestroy - Destroys any PetscObject, regardless of the type. 113 114 Collective on PetscObject 115 116 Input Parameter: 117 . obj - any PETSc object, for example a Vec, Mat or KSP. 118 This must be cast with a (PetscObject), for example, 119 PetscObjectDestroy((PetscObject)mat); 120 121 Level: beginner 122 123 Concepts: destroying object 124 Concepts: freeing object 125 Concepts: deleting object 126 127 @*/ 128 PetscErrorCode PETSC_DLLEXPORT PetscObjectDestroy(PetscObject obj) 129 { 130 PetscErrorCode ierr; 131 132 PetscFunctionBegin; 133 PetscValidHeader(obj,1); 134 135 if (obj->bops->destroy) { 136 ierr = (*obj->bops->destroy)(obj);CHKERRQ(ierr); 137 } else { 138 SETERRQ1(PETSC_ERR_PLIB,"This PETSc object of class %s does not have a generic destroy routine",obj->class_name); 139 } 140 PetscFunctionReturn(0); 141 } 142 143 #undef __FUNCT__ 144 #define __FUNCT__ "PetscObjectView" 145 /*@C 146 PetscObjectView - Views any PetscObject, regardless of the type. 147 148 Collective on PetscObject 149 150 Input Parameters: 151 + obj - any PETSc object, for example a Vec, Mat or KSP. 152 This must be cast with a (PetscObject), for example, 153 PetscObjectView((PetscObject)mat,viewer); 154 - viewer - any PETSc viewer 155 156 Level: intermediate 157 158 @*/ 159 PetscErrorCode PETSC_DLLEXPORT PetscObjectView(PetscObject obj,PetscViewer viewer) 160 { 161 PetscErrorCode ierr; 162 163 PetscFunctionBegin; 164 PetscValidHeader(obj,1); 165 if (!viewer) { 166 ierr = PetscViewerASCIIGetStdout(obj->comm,&viewer);CHKERRQ(ierr); 167 } 168 PetscValidHeaderSpecific(viewer,PETSC_VIEWER_COOKIE,2); 169 170 if (obj->bops->view) { 171 ierr = (*obj->bops->view)(obj,viewer);CHKERRQ(ierr); 172 } else { 173 SETERRQ(PETSC_ERR_SUP,"This PETSc object does not have a generic viewer routine"); 174 } 175 PetscFunctionReturn(0); 176 } 177 178 #undef __FUNCT__ 179 #define __FUNCT__ "PetscTypeCompare" 180 /*@C 181 PetscTypeCompare - Determines whether a PETSc object is of a particular type. 182 183 Not Collective 184 185 Input Parameters: 186 + obj - any PETSc object, for example a Vec, Mat or KSP. 187 This must be cast with a (PetscObject), for example, 188 PetscObjectDestroy((PetscObject)mat); 189 - type_name - string containing a type name 190 191 Output Parameter: 192 . same - PETSC_TRUE if they are the same, else PETSC_FALSE 193 194 Level: intermediate 195 196 .seealso: VecGetType(), KSPGetType(), PCGetType(), SNESGetType() 197 198 Concepts: comparing^object types 199 Concepts: types^comparing 200 Concepts: object type^comparing 201 202 @*/ 203 PetscErrorCode PETSC_DLLEXPORT PetscTypeCompare(PetscObject obj,const char type_name[],PetscTruth *same) 204 { 205 PetscErrorCode ierr; 206 207 PetscFunctionBegin; 208 if (!obj) { 209 *same = PETSC_FALSE; 210 } else if (!type_name && !obj->type_name) { 211 *same = PETSC_TRUE; 212 } else if (!type_name || !obj->type_name) { 213 *same = PETSC_FALSE; 214 } else { 215 PetscValidHeader(obj,1); 216 PetscValidCharPointer(type_name,2); 217 PetscValidPointer(same,3); 218 ierr = PetscStrcmp((char*)(obj->type_name),type_name,same);CHKERRQ(ierr); 219 } 220 PetscFunctionReturn(0); 221 } 222 223 static int PetscObjectRegisterDestroy_Count = 0; 224 static PetscObject PetscObjectRegisterDestroy_Objects[256]; 225 226 #undef __FUNCT__ 227 #define __FUNCT__ "PetscObjectRegisterDestroy" 228 /*@C 229 PetscObjectRegisterDestroy - Registers a PETSc object to be destroyed when 230 PetscFinalize() is called. 231 232 Collective on PetscObject 233 234 Input Parameter: 235 . obj - any PETSc object, for example a Vec, Mat or KSP. 236 This must be cast with a (PetscObject), for example, 237 PetscObjectRegisterDestroy((PetscObject)mat); 238 239 Level: developer 240 241 Notes: 242 This is used by, for example, PETSC_VIEWER_XXX_() routines to free the viewer 243 when PETSc ends. 244 245 .seealso: PetscObjectRegisterDestroyAll() 246 @*/ 247 PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroy(PetscObject obj) 248 { 249 PetscFunctionBegin; 250 PetscValidHeader(obj,1); 251 PetscObjectRegisterDestroy_Objects[PetscObjectRegisterDestroy_Count++] = obj; 252 PetscFunctionReturn(0); 253 } 254 255 #undef __FUNCT__ 256 #define __FUNCT__ "PetscObjectRegisterDestroyAll" 257 /*@C 258 PetscObjectRegisterDestroyAll - Frees all the PETSc objects that have been registered 259 with PetscObjectRegisterDestroy(). Called by PetscFinalize() 260 PetscFinalize() is called. 261 262 Collective on individual PetscObjects 263 264 Level: developer 265 266 .seealso: PetscObjectRegisterDestroy() 267 @*/ 268 PetscErrorCode PETSC_DLLEXPORT PetscObjectRegisterDestroyAll(void) 269 { 270 PetscErrorCode ierr; 271 int i; 272 273 PetscFunctionBegin; 274 for (i=0; i<PetscObjectRegisterDestroy_Count; i++) { 275 ierr = PetscObjectDestroy(PetscObjectRegisterDestroy_Objects[i]);CHKERRQ(ierr); 276 } 277 PetscFunctionReturn(0); 278 } 279 280 281