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