1 2 #include <petsc-private/petscimpl.h> /*I "petscsys.h" I*/ 3 #include <petscviewer.h> 4 5 /* 6 If true then every PETSc object will be published with the AMS 7 */ 8 PetscBool PetscAMSPublishAll; 9 10 #undef __FUNCT__ 11 #define __FUNCT__ "PetscObjectAMSPublish" 12 /*@C 13 PetscObjectAMSPublish - Publish an object 14 15 Collective on PetscObject 16 17 Input Parameters: 18 . obj - the Petsc variable 19 Thus must be cast with a (PetscObject), for example, 20 PetscObjectSetName((PetscObject)mat,name); 21 22 Notes: PetscViewer objects are not published 23 24 Level: advanced 25 26 Concepts: publishing object 27 28 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish() 29 30 @*/ 31 PetscErrorCode PetscObjectAMSPublish(PetscObject obj) 32 { 33 PetscErrorCode ierr; 34 AMS_Memory amem; 35 AMS_Comm acomm; 36 37 PetscFunctionBegin; 38 PetscValidHeader(obj,1); 39 if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0); 40 if (obj->amsmem != -1) PetscFunctionReturn(0); 41 ierr = PetscObjectName(obj);CHKERRQ(ierr); 42 43 ierr = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_(PETSC_COMM_WORLD),&acomm);CHKERRQ(ierr); 44 /* Really want to attach to correct communicator but then browser needs to access multiple communicators 45 ierr = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_(obj->comm),&acomm);CHKERRQ(ierr); */ 46 47 ierr = AMS_Memory_create(acomm,obj->name,&amem);CHKERRQ(ierr); 48 obj->amsmem = (int)amem; 49 50 ierr = AMS_Memory_take_access(amem);CHKERRQ(ierr); 51 ierr = AMS_Memory_add_field(amem,"Class",&obj->class_name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 52 ierr = AMS_Memory_add_field(amem,"Type",&obj->type_name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 53 ierr = AMS_Memory_add_field(amem,"Id",&obj->id,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 54 ierr = AMS_Memory_add_field(amem,"ParentId",&obj->parentid,1,AMS_INT,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 55 ierr = AMS_Memory_add_field(amem,"Name",&obj->name,1,AMS_STRING,AMS_READ,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 56 ierr = AMS_Memory_add_field(amem,"Block",&obj->amspublishblock,1,AMS_BOOLEAN,AMS_WRITE,AMS_COMMON,AMS_REDUCT_UNDEF);CHKERRQ(ierr); 57 if (obj->bops->publish) { 58 ierr = (*obj->bops->publish)(obj);CHKERRQ(ierr); 59 } 60 ierr = AMS_Memory_publish(amem);CHKERRQ(ierr); 61 ierr = AMS_Memory_grant_access(amem);CHKERRQ(ierr); 62 PetscFunctionReturn(0); 63 } 64 65 #undef __FUNCT__ 66 #define __FUNCT__ "PetscObjectAMSBlock" 67 /*@C 68 PetscObjectAMSBlock - Blocks the object if PetscObjectAMSSetBlock() has been called 69 70 Collective on PetscObject 71 72 Input Parameters: 73 . obj - the Petsc variable 74 Thus must be cast with a (PetscObject), for example, 75 PetscObjectSetName((PetscObject)mat,name); 76 77 78 Level: advanced 79 80 Concepts: publishing object 81 82 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish(), PetscObjectAMSSetBlock() 83 84 @*/ 85 PetscErrorCode PetscObjectAMSBlock(PetscObject obj) 86 { 87 PetscFunctionBegin; 88 PetscValidHeader(obj,1); 89 90 if (!obj->amspublishblock) PetscFunctionReturn(0); 91 /* Eventually this will be fixed to check if the AMS client has changed the lock */ 92 while (1); 93 PetscFunctionReturn(0); 94 } 95 96 #undef __FUNCT__ 97 #define __FUNCT__ "PetscObjectAMSSetBlock" 98 /*@C 99 PetscObjectAMSSetBlock - Sets whether an object will block at PetscObjectAMSBlock() 100 101 Collective on PetscObject 102 103 Input Parameters: 104 + obj - the Petsc variable 105 Thus must be cast with a (PetscObject), for example, 106 PetscObjectSetName((PetscObject)mat,name); 107 - flg - whether it should block 108 109 Level: advanced 110 111 Concepts: publishing object 112 113 .seealso: PetscObjectSetName(), PetscObjectAMSUnPublish(), PetscObjectAMSBlock() 114 115 @*/ 116 PetscErrorCode PetscObjectAMSSetBlock(PetscObject obj,PetscBool flg) 117 { 118 PetscFunctionBegin; 119 PetscValidHeader(obj,1); 120 obj->amspublishblock = flg; 121 PetscFunctionReturn(0); 122 } 123 124 #undef __FUNCT__ 125 #define __FUNCT__ "PetscObjectAMSUnPublish" 126 PetscErrorCode PetscObjectAMSUnPublish(PetscObject obj) 127 { 128 AMS_Comm acomm; 129 PetscErrorCode ierr; 130 131 PetscFunctionBegin; 132 if (obj->classid == PETSC_VIEWER_CLASSID) PetscFunctionReturn(0); 133 if (obj->amsmem == -1) PetscFunctionReturn(0); 134 ierr = PetscViewerAMSGetAMSComm(PETSC_VIEWER_AMS_(obj->comm),&acomm);CHKERRQ(ierr); 135 ierr = AMS_Memory_destroy(obj->amsmem);CHKERRQ(ierr); 136 obj->amsmem = -1; 137 PetscFunctionReturn(0); 138 } 139 140